verifiers 0.2.2.dev49__tar.gz → 0.2.2.dev51__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_color_codeword_tasks.py +1 -3
  3. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_e2e.py +3 -3
  4. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_judges.py +6 -18
  5. verifiers-0.2.2.dev51/tests/v1/test_taskset.py +93 -0
  6. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/debug.py +8 -1
  7. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/runner.py +18 -4
  8. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/validate.py +8 -1
  9. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/judge.py +3 -10
  10. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/taskset.py +5 -0
  11. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/env.py +2 -2
  12. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/agentic_judge/env.py +11 -21
  13. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/adapter.py +4 -8
  14. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/runner.py +18 -2
  15. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judge.py +6 -6
  16. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/loaders.py +4 -4
  17. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/server.py +2 -2
  18. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/state.py +2 -2
  19. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/task.py +42 -34
  20. verifiers-0.2.2.dev51/verifiers/v1/taskset.py +116 -0
  21. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/taskset.py +1 -2
  22. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/generic.py +1 -1
  23. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/sampling.py +4 -5
  24. verifiers-0.2.2.dev49/tests/v1/test_taskset.py +0 -71
  25. verifiers-0.2.2.dev49/verifiers/v1/taskset.py +0 -98
  26. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/.gitignore +0 -0
  27. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/LICENSE +0 -0
  28. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/README.md +0 -0
  29. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/pyproject.toml +0 -0
  30. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/__init__.py +0 -0
  31. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/conftest.py +0 -0
  32. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_browser_env.py +0 -0
  33. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_build_script.py +0 -0
  34. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_cli_agent_env.py +0 -0
  35. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_auth_errors.py +0 -0
  36. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_config.py +0 -0
  37. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_client_multimodal_types.py +0 -0
  38. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_composable_env.py +0 -0
  39. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_context_token_metrics.py +0 -0
  40. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_decorator_ranks.py +0 -0
  41. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_endpoint_registry.py +0 -0
  42. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_env_group.py +0 -0
  43. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_env_server.py +0 -0
  44. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_environment.py +0 -0
  45. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_environment_extra.py +0 -0
  46. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_error_chain.py +0 -0
  47. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_eval_display.py +0 -0
  48. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_eval_utils.py +0 -0
  49. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gepa_cli.py +0 -0
  50. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gepa_utils.py +0 -0
  51. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_gym_env.py +0 -0
  52. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_harbor_env_mcp.py +0 -0
  53. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_imports.py +0 -0
  54. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_init_script.py +0 -0
  55. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_install_utils.py +0 -0
  56. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_interception_utils.py +0 -0
  57. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_logging.py +0 -0
  58. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_math_rubric.py +0 -0
  59. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_maybe_think_parser.py +0 -0
  60. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_message_utils.py +0 -0
  61. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_message_utils_multimodal.py +0 -0
  62. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_multiturn_env.py +0 -0
  63. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_nemorl_client.py +0 -0
  64. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openai_chat_completions_token_client.py +0 -0
  65. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openai_responses_client.py +0 -0
  66. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_opencode_rlm_env.py +0 -0
  67. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_openenv_client.py +0 -0
  68. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_parser.py +0 -0
  69. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_path_utils.py +0 -0
  70. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_per_turn_timing.py +0 -0
  71. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_pricing_utils.py +0 -0
  72. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_prime_plugin.py +0 -0
  73. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_renderer_client.py +0 -0
  74. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_renderer_e2e.py +0 -0
  75. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rlm_composable_env.py +0 -0
  76. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rubric.py +0 -0
  77. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_rubric_group.py +0 -0
  78. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_debug_env.py +0 -0
  79. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_env.py +0 -0
  80. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_sandbox_mixin.py +0 -0
  81. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_save_utils.py +0 -0
  82. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_setup_script.py +0 -0
  83. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_singleturn_env.py +0 -0
  84. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_stateful_tool_env.py +0 -0
  85. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_think_parser.py +0 -0
  86. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tool_env.py +0 -0
  87. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tool_utils.py +0 -0
  88. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_trajectory_processing.py +0 -0
  89. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_tui_info_formatting.py +0 -0
  90. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_types.py +0 -0
  91. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/test_xml_parser.py +0 -0
  92. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/conftest.py +0 -0
  93. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  94. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/duet_v1.py +0 -0
  95. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  96. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  97. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  98. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  99. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  100. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_v0.py +0 -0
  101. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/echo_v1.py +0 -0
  102. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/pyproject.toml +0 -0
  103. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  104. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_configs.py +0 -0
  105. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_envs.py +0 -0
  106. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_graph.py +0 -0
  107. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_legacy.py +0 -0
  108. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_scoring.py +0 -0
  109. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/tests/v1/test_trace.py +0 -0
  110. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/__init__.py +0 -0
  111. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/__init__.py +0 -0
  112. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/__init__.py +0 -0
  113. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/build.py +0 -0
  114. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/eval.py +0 -0
  115. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/gepa.py +0 -0
  116. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/init.py +0 -0
  117. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/install.py +0 -0
  118. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/commands/setup.py +0 -0
  119. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/plugins/__init__.py +0 -0
  120. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/plugins/prime.py +0 -0
  121. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/cli/tui.py +0 -0
  122. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/__init__.py +0 -0
  123. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/anthropic_messages_client.py +0 -0
  124. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/client.py +0 -0
  125. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  126. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_chat_completions_client.py +0 -0
  127. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  128. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_completions_client.py +0 -0
  129. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/openai_responses_client.py +0 -0
  130. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/clients/renderer_client.py +0 -0
  131. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/decorators.py +0 -0
  132. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/__init__.py +0 -0
  133. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/env_group.py +0 -0
  134. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/environment.py +0 -0
  135. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/README.md +0 -0
  136. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/__init__.py +0 -0
  137. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  138. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/README.md +0 -0
  139. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/__init__.py +0 -0
  140. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/_filter.py +0 -0
  141. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  142. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harness.py +0 -0
  143. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  144. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  145. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  146. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  147. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  148. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  149. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  150. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/task.py +0 -0
  151. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  152. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  153. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  154. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  155. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  156. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  157. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  158. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  159. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  160. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  161. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  162. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  163. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  164. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  165. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  166. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  167. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  168. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  169. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  170. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  171. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  172. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  173. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  174. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  175. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  176. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  177. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  178. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  179. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  180. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  181. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  182. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  183. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  184. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  185. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/gym_env.py +0 -0
  186. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  187. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  188. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  189. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/mcp_env.py +0 -0
  190. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_env.py +0 -0
  191. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  192. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  193. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  194. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/__init__.py +0 -0
  195. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  196. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  197. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/README.md +0 -0
  198. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/__init__.py +0 -0
  199. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/README.md +0 -0
  200. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  201. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  202. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  203. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  204. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  205. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  206. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/openenv_env.py +0 -0
  207. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  208. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/integrations/textarena_env.py +0 -0
  209. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/multiturn_env.py +0 -0
  210. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/python_env.py +0 -0
  211. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/sandbox_env.py +0 -0
  212. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/singleturn_env.py +0 -0
  213. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/stateful_tool_env.py +0 -0
  214. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/envs/tool_env.py +0 -0
  215. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/errors.py +0 -0
  216. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/__init__.py +0 -0
  217. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/adapter.py +0 -0
  218. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/config.py +0 -0
  219. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/display.py +0 -0
  220. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/gepa/gepa_utils.py +0 -0
  221. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/__init__.py +0 -0
  222. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/maybe_think_parser.py +0 -0
  223. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/parser.py +0 -0
  224. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/think_parser.py +0 -0
  225. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/parsers/xml_parser.py +0 -0
  226. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/__init__.py +0 -0
  227. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  228. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/judge_rubric.py +0 -0
  229. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/math_rubric.py +0 -0
  230. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/rubric.py +0 -0
  231. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/rubrics/rubric_group.py +0 -0
  232. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/__init__.py +0 -0
  233. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/build.py +0 -0
  234. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/eval.py +0 -0
  235. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/gepa.py +0 -0
  236. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/init.py +0 -0
  237. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/install.py +0 -0
  238. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/setup.py +0 -0
  239. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/scripts/tui.py +0 -0
  240. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/__init__.py +0 -0
  241. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/client/env_client.py +0 -0
  242. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/client/zmq_env_client.py +0 -0
  243. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/__init__.py +0 -0
  244. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_router.py +0 -0
  245. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_server.py +0 -0
  246. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/env_worker.py +0 -0
  247. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/server/zmq_env_server.py +0 -0
  248. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/serve/types.py +0 -0
  249. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/types.py +0 -0
  250. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/__init__.py +0 -0
  251. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/async_utils.py +0 -0
  252. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/client_utils.py +0 -0
  253. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/config_utils.py +0 -0
  254. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/data_utils.py +0 -0
  255. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/display_utils.py +0 -0
  256. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/env_config_utils.py +0 -0
  257. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/env_utils.py +0 -0
  258. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/error_utils.py +0 -0
  259. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/eval_display.py +0 -0
  260. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/eval_utils.py +0 -0
  261. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/heartbeat.py +0 -0
  262. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/import_utils.py +0 -0
  263. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/install_utils.py +0 -0
  264. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/interception_utils.py +0 -0
  265. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/logging_utils.py +0 -0
  266. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/message_utils.py +0 -0
  267. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/metric_utils.py +0 -0
  268. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/path_utils.py +0 -0
  269. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/pricing_utils.py +0 -0
  270. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/process_utils.py +0 -0
  271. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/response_utils.py +0 -0
  272. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/save_utils.py +0 -0
  273. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/serve_utils.py +0 -0
  274. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/thread_utils.py +0 -0
  275. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/threaded_sandbox_client.py +0 -0
  276. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/tool_utils.py +0 -0
  277. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/usage_utils.py +0 -0
  278. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/utils/version_utils.py +0 -0
  279. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/__init__.py +0 -0
  280. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/acp/__init__.py +0 -0
  281. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/acp/_runner.py +0 -0
  282. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/agent.py +0 -0
  283. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/__init__.py +0 -0
  284. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  285. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/base.py +0 -0
  286. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/eval.py +0 -0
  287. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/replay.py +0 -0
  288. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/dashboard/validate.py +0 -0
  289. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/__init__.py +0 -0
  290. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/main.py +0 -0
  291. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/eval/resume.py +0 -0
  292. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/gepa.py +0 -0
  293. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/init.py +0 -0
  294. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/output.py +0 -0
  295. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/replay.py +0 -0
  296. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/resolve.py +0 -0
  297. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/cli/serve.py +0 -0
  298. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/__init__.py +0 -0
  299. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/client.py +0 -0
  300. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/config.py +0 -0
  301. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/eval.py +0 -0
  302. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/clients/train.py +0 -0
  303. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/__init__.py +0 -0
  304. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/agent.py +0 -0
  305. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/__init__.py +0 -0
  306. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/debug.py +0 -0
  307. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/env.py +0 -0
  308. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/eval.py +0 -0
  309. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/init.py +0 -0
  310. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/replay.py +0 -0
  311. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/serve.py +0 -0
  312. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/cli/validate.py +0 -0
  313. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/env.py +0 -0
  314. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/harness.py +0 -0
  315. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/legacy.py +0 -0
  316. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/retries.py +0 -0
  317. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/serve.py +0 -0
  318. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/configs/task.py +0 -0
  319. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/decorators.py +0 -0
  320. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/__init__.py +0 -0
  321. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/anthropic.py +0 -0
  322. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/base.py +0 -0
  323. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/chat.py +0 -0
  324. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/dialects/responses.py +0 -0
  325. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/__init__.py +0 -0
  326. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  327. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  328. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/best_of_n/env.py +0 -0
  329. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  330. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/single_agent/env.py +0 -0
  331. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  332. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/envs/user_sim/env.py +0 -0
  333. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/episode.py +0 -0
  334. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/errors.py +0 -0
  335. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/__init__.py +0 -0
  336. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/config.py +0 -0
  337. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/dataset.py +0 -0
  338. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/gepa/reflection.py +0 -0
  339. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/graph.py +0 -0
  340. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harness.py +0 -0
  341. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/__init__.py +0 -0
  342. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  343. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/harness.py +0 -0
  344. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/bash/program.py +0 -0
  345. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  346. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  347. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  348. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/codex/harness.py +0 -0
  349. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  350. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  351. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  352. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  353. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  354. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/__init__.py +0 -0
  355. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/harness.py +0 -0
  356. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/null/program.py +0 -0
  357. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  358. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pi/harness.py +0 -0
  359. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  360. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/pool/harness.py +0 -0
  361. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  362. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  363. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  364. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  365. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  366. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/__init__.py +0 -0
  367. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/base.py +0 -0
  368. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/server.py +0 -0
  370. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  371. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/base.py +0 -0
  372. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/custom.py +0 -0
  373. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/interception/tunnel/prime.py +0 -0
  374. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/__init__.py +0 -0
  375. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/reference.py +0 -0
  376. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/reference.txt +0 -0
  377. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/rubric.py +0 -0
  378. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/judges/rubric.txt +0 -0
  379. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/legacy.py +0 -0
  380. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/__init__.py +0 -0
  381. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/launch.py +0 -0
  382. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/mcp/toolset.py +0 -0
  383. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/push.py +0 -0
  384. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/retries.py +0 -0
  385. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/rollout.py +0 -0
  386. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/__init__.py +0 -0
  387. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/base.py +0 -0
  388. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  389. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/docker/egress.py +0 -0
  390. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/limiters.py +0 -0
  391. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/modal.py +0 -0
  392. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/prime.py +0 -0
  393. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/runtimes/subprocess.py +0 -0
  394. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/scoring.py +0 -0
  395. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/__init__.py +0 -0
  396. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/client.py +0 -0
  397. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/pool.py +0 -0
  398. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/server.py +0 -0
  399. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/serve/types.py +0 -0
  400. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/session.py +0 -0
  401. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/__init__.py +0 -0
  402. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  403. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  404. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  405. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  406. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  407. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  408. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  409. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  410. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/trace.py +0 -0
  411. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/types.py +0 -0
  412. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/__init__.py +0 -0
  413. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/aio.py +0 -0
  414. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/compile.py +0 -0
  415. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/format.py +0 -0
  416. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/git.py +0 -0
  417. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/image.py +0 -0
  418. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/install.py +0 -0
  419. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/interrupt.py +0 -0
  420. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/logging.py +0 -0
  421. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/memory.py +0 -0
  422. {verifiers-0.2.2.dev49 → verifiers-0.2.2.dev51}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev49
3
+ Version: 0.2.2.dev51
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
@@ -10,9 +10,7 @@ def test_color_images_are_rendered_once(monkeypatch) -> None:
10
10
  return render(image)
11
11
 
12
12
  monkeypatch.setattr(taskset, "image_data_url", counted)
13
- tasks = taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).select(
14
- num_tasks=100
15
- )
13
+ tasks = list(taskset.ColorCodewordTaskset(taskset.ColorCodewordConfig()).head(100))
16
14
 
17
15
  assert len(tasks) == 100
18
16
  assert calls == list(taskset.COLOR_RGB.values())
@@ -401,6 +401,8 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
401
401
  model's call. Exercises the config surface too: a policy-only prompt
402
402
  override (the verdict contract is appended regardless) and
403
403
  reward-composition weights."""
404
+ policy = tmp_path / "judge_policy.txt"
405
+ policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
404
406
  traces = await run_v1(
405
407
  "echo-v1",
406
408
  harness=None, # seats pin their own harness; there is no run-level one
@@ -414,9 +416,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
414
416
  "harness": {"id": "bash"},
415
417
  "max_output_tokens": 8192,
416
418
  },
417
- "task": {
418
- "prompt": "Check EMPIRICALLY that the agent echoed the word back.",
419
- },
419
+ "task": {"prompt": str(policy)},
420
420
  "score": {"task_weight": 0.5},
421
421
  },
422
422
  output_dir=tmp_path,
@@ -371,32 +371,20 @@ async def test_rubric_view_full_trace(tmp_path, fake_judge_model):
371
371
  assert all("SECRET REASONING" not in prompt for prompt in fake_judge_model)
372
372
 
373
373
 
374
- async def test_config_prompt_overrides_class_template(fake_judge_model):
375
- judge = vf.ReferenceJudge(
376
- vf.ReferenceJudgeConfig(prompt="Q:{question} A:{answer} R:{response}")
377
- )
374
+ async def test_config_prompt_overrides_class_template(tmp_path, fake_judge_model):
375
+ # Config `prompt` is a file path; the same {field} placeholders work.
376
+ file = tmp_path / "judge.txt"
377
+ file.write_text("Q:{question} A:{answer} R:{response}")
378
+ judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=file))
378
379
  assert judge.build_messages(question="q", answer="a", response="r") == "Q:q A:a R:r"
379
380
  # A template needn't use every evaluate field: score also passes {positive}/{negative},
380
381
  # which str.format ignores when the (custom) prompt doesn't reference them.
381
382
  trace = make_trace()
382
383
  assert await judge.score(trace.task.data, trace) == 1.0
383
384
  assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
384
-
385
-
386
- async def test_prompt_file(tmp_path, fake_judge_model):
387
- # The prompt template can come from a file; the same {field} placeholders work.
388
- file = tmp_path / "judge.txt"
389
- file.write_text("Q:{question} A:{answer} R:{response}")
390
- trace = make_trace()
391
- judge = vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=file))
392
- assert await judge.score(trace.task.data, trace) == 1.0
393
- assert fake_judge_model[0] == "Q:Capital of France? A:Paris R:It is Paris."
394
385
  # a bad path fails at judge construction, not mid-eval at score time
395
386
  with pytest.raises(FileNotFoundError):
396
- vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt_file=tmp_path / "missing.txt"))
397
- # inline and file prompts are mutually exclusive
398
- with pytest.raises(ValueError, match="not both"):
399
- vf.ReferenceJudgeConfig(prompt="inline", prompt_file=file)
387
+ vf.ReferenceJudge(vf.ReferenceJudgeConfig(prompt=tmp_path / "missing.txt"))
400
388
 
401
389
 
402
390
  # --- reference input/verdict knobs ------------------------------------------------------------
@@ -0,0 +1,93 @@
1
+ """`Taskset` iteration and the `head`/`shuffle` views over list, generator,
2
+ and `INFINITE` `load` implementations."""
3
+
4
+ import itertools
5
+
6
+ import pytest
7
+
8
+ import verifiers.v1 as vf
9
+
10
+
11
+ class CountTask(vf.Task[vf.TaskData]):
12
+ pass
13
+
14
+
15
+ class InfiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
16
+ INFINITE = True
17
+
18
+ def load(self):
19
+ for i in itertools.count():
20
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
21
+
22
+
23
+ class FiniteTaskset(vf.Taskset[CountTask, vf.TasksetConfig]):
24
+ def load(self):
25
+ for i in range(10):
26
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
27
+
28
+
29
+ def idxs(tasks) -> list[int]:
30
+ return [task.data.idx for task in tasks]
31
+
32
+
33
+ def test_head_bounds_an_infinite_taskset() -> None:
34
+ tasks = list(InfiniteTaskset(vf.TasksetConfig()).head(5))
35
+ assert idxs(tasks) == [0, 1, 2, 3, 4]
36
+
37
+
38
+ def test_iteration_materializes_a_finite_taskset() -> None:
39
+ taskset = FiniteTaskset(vf.TasksetConfig())
40
+ assert len(list(taskset)) == 10
41
+ assert idxs(taskset.head(4)) == [0, 1, 2, 3]
42
+
43
+
44
+ def test_head_returns_the_same_taskset_type() -> None:
45
+ view = FiniteTaskset(vf.TasksetConfig()).head(4)
46
+ assert isinstance(view, FiniteTaskset)
47
+ assert view.task_type() is CountTask
48
+
49
+
50
+ def test_shuffle_samples_the_whole_taskset_reproducibly() -> None:
51
+ taskset = FiniteTaskset(vf.TasksetConfig())
52
+ first = idxs(taskset.shuffle().head(5))
53
+ assert first == idxs(taskset.shuffle().head(5))
54
+ assert len(first) == 5 and set(first) <= set(range(10))
55
+ assert first != [0, 1, 2, 3, 4] # sampled from the whole set, not the head
56
+
57
+
58
+ def test_shuffle_seed_changes_the_sample() -> None:
59
+ taskset = FiniteTaskset(vf.TasksetConfig())
60
+ seeded = idxs(taskset.shuffle(seed=7).head(5))
61
+ assert seeded == idxs(taskset.shuffle(seed=7).head(5)) # reproducible per seed
62
+ assert seeded != idxs(taskset.shuffle().head(5)) # differs from the default seed
63
+
64
+
65
+ def test_shuffle_raises_on_infinite() -> None:
66
+ with pytest.raises(ValueError, match="infinite"):
67
+ InfiniteTaskset(vf.TasksetConfig()).shuffle()
68
+
69
+
70
+ def test_head_then_shuffle_bounds_an_infinite_taskset() -> None:
71
+ head = idxs(InfiniteTaskset(vf.TasksetConfig()).head(5).shuffle())
72
+ assert sorted(head) == [0, 1, 2, 3, 4]
73
+ assert head != [0, 1, 2, 3, 4] # shuffled within the bounded head
74
+
75
+
76
+ def test_head_only_builds_what_the_run_takes() -> None:
77
+ built: list[int] = []
78
+
79
+ class RecordingTaskset(InfiniteTaskset):
80
+ def load(self):
81
+ for i in itertools.count():
82
+ built.append(i)
83
+ yield CountTask(vf.TaskData(idx=i, prompt=f"task {i}"))
84
+
85
+ list(RecordingTaskset(vf.TasksetConfig()).head(3))
86
+ assert built == [0, 1, 2]
87
+
88
+
89
+ def test_views_do_not_mutate_the_base_taskset() -> None:
90
+ taskset = InfiniteTaskset(vf.TasksetConfig())
91
+ view = taskset.head(3)
92
+ assert view.INFINITE is False and taskset.INFINITE is True
93
+ assert idxs(taskset.head(2)) == [0, 1] # base iterates untransformed
@@ -263,7 +263,14 @@ async def debug_task(task: Task, config: DebugConfig) -> tuple[Trace, bool]:
263
263
 
264
264
  async def run_debug(config: DebugConfig) -> list[Trace]:
265
265
  taskset = vf.load_taskset(config.taskset)
266
- tasks = taskset.select(config.num_tasks, config.shuffle)
266
+ if config.num_tasks is None and taskset.INFINITE:
267
+ raise ValueError(
268
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
269
+ )
270
+ selected = taskset.shuffle() if config.shuffle else taskset
271
+ if config.num_tasks is not None:
272
+ selected = selected.head(config.num_tasks)
273
+ tasks = list(selected)
267
274
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
268
275
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
269
276
  ):
@@ -26,7 +26,15 @@ logger = logging.getLogger(__name__)
26
26
  async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
27
27
  logger.info("eval config:\n%s", config.model_dump_json(indent=2))
28
28
  client = resolve_client(config.client)
29
- tasks = env.taskset.select(config.num_tasks, config.shuffle)
29
+ taskset = env.taskset
30
+ if config.num_tasks is None and taskset.INFINITE:
31
+ raise ValueError(
32
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
33
+ )
34
+ selected = taskset.shuffle() if config.shuffle else taskset
35
+ if config.num_tasks is not None:
36
+ selected = selected.head(config.num_tasks)
37
+ tasks = list(selected)
30
38
  ctx = ModelContext(client=client, model=config.model, sampling=config.sampling)
31
39
  semaphore = (
32
40
  asyncio.Semaphore(config.max_concurrent) if config.max_concurrent else None
@@ -132,9 +140,15 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
132
140
 
133
141
  # The client owns the taskset: load it here, once — the server (and its pool
134
142
  # workers) never load data, they rebuild each dispatched task from its request.
135
- tasks = load_taskset(config.env.taskset).select(
136
- config.num_tasks, config.shuffle
137
- )
143
+ taskset = load_taskset(config.env.taskset)
144
+ if config.num_tasks is None and taskset.INFINITE:
145
+ raise ValueError(
146
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
147
+ )
148
+ selected = taskset.shuffle() if config.shuffle else taskset
149
+ if config.num_tasks is not None:
150
+ selected = selected.head(config.num_tasks)
151
+ tasks = list(selected)
138
152
  # Spawned processes inherit no logging — hand them the main process's setup so
139
153
  # their rollout logs land in the output dir.
140
154
  level = "DEBUG" if config.verbose else "INFO"
@@ -203,7 +203,14 @@ async def _validate_task(task: Task, config: ValidateConfig) -> ResultRow:
203
203
 
204
204
  async def run_validate(config: ValidateConfig) -> list[dict]:
205
205
  taskset = vf.load_taskset(config.taskset)
206
- tasks = taskset.select(config.num_tasks, config.shuffle)
206
+ if config.num_tasks is None and taskset.INFINITE:
207
+ raise ValueError(
208
+ f"{type(taskset).__name__} is infinite - bound the run with -n"
209
+ )
210
+ selected = taskset.shuffle() if config.shuffle else taskset
211
+ if config.num_tasks is not None:
212
+ selected = selected.head(config.num_tasks)
213
+ tasks = list(selected)
207
214
  if isinstance(config.runtime, vf.SubprocessConfig) and any(
208
215
  type(t).NEEDS_CONTAINER or t.data.image for t in tasks
209
216
  ):
@@ -5,7 +5,7 @@ from collections.abc import Sequence
5
5
  from pathlib import Path
6
6
  from typing import Any
7
7
 
8
- from pydantic import BaseModel, SerializeAsAny, model_validator
8
+ from pydantic import BaseModel, SerializeAsAny
9
9
 
10
10
  from verifiers.v1.clients import BaseClientConfig
11
11
  from verifiers.v1.types import ID, SamplingConfig
@@ -20,15 +20,8 @@ class JudgeConfig(BaseClientConfig):
20
20
  weight: float = 1.0
21
21
  model: str = "openai/gpt-5.4-nano"
22
22
  sampling: SamplingConfig = SamplingConfig()
23
- prompt: str | None = None
24
- prompt_file: Path | None = None
25
- """Prompt file override, mutually exclusive with `prompt`."""
26
-
27
- @model_validator(mode="after")
28
- def check_prompt_source(self) -> "JudgeConfig":
29
- if self.prompt is not None and self.prompt_file is not None:
30
- raise ValueError("set `prompt` or `prompt_file`, not both")
31
- return self
23
+ prompt: Path | None = None
24
+ """File whose text overrides the judge's default prompt template."""
32
25
 
33
26
 
34
27
  Judges = list[SerializeAsAny[JudgeConfig]]
@@ -1,5 +1,7 @@
1
1
  """The taskset plugin's config: which rows load, under `--env.taskset.*`."""
2
2
 
3
+ from pathlib import Path
4
+
3
5
  from pydantic import SerializeAsAny
4
6
  from pydantic_config import BaseConfig
5
7
 
@@ -14,6 +16,9 @@ class TasksetConfig(BaseConfig):
14
16
  positional `eval <taskset-id>`)."""
15
17
  task: SerializeAsAny[TaskConfig] = TaskConfig()
16
18
  """Config passed to each task, under `--env.taskset.task.*`."""
19
+ system_prompt: Path | None = None
20
+ """File whose text overrides each task's `TaskData.system_prompt` on
21
+ iteration (e.g. a GEPA `best_system_prompt.txt`)."""
17
22
 
18
23
  @property
19
24
  def name(self) -> str:
@@ -33,7 +33,7 @@ from verifiers.v1.retries import run_episode_with_retry
33
33
  from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
34
34
  from verifiers.v1.task import Task, resolve_server_config
35
35
  from verifiers.v1.trace import Error, Trace
36
- from verifiers.v1.utils.generic import generic_type
36
+ from verifiers.v1.utils.generic import concrete_type
37
37
  from verifiers.v1.utils.memory import trim_memory_periodically
38
38
 
39
39
  logger = logging.getLogger(__name__)
@@ -83,7 +83,7 @@ class Env(ABC, Generic[ConfigT]):
83
83
  def __init__(self, config: ConfigT) -> None:
84
84
  from verifiers.v1.loaders import load_harness, load_taskset
85
85
 
86
- config_cls = generic_type(type(self), EnvConfig, origin=Env) or EnvConfig
86
+ config_cls = concrete_type(type(self), EnvConfig, origin=Env) or EnvConfig
87
87
  if not isinstance(config, config_cls):
88
88
  raise TypeError(
89
89
  f"{type(self).__name__} declares Env[{config_cls.__name__}], "
@@ -180,41 +180,31 @@ class JudgeTask(vf.Task):
180
180
  class JudgeTaskConfig(vf.BaseConfig):
181
181
  """The judge's minted task: the grading policy and what lands in its box."""
182
182
 
183
- prompt: Path | str | None = None
184
- """Grading-policy override: inline text, or a policy file (a value ending in
185
- `.md`/`.txt` is read from disk). Replaces only the policy body — the verdict
186
- contract and workspace note are always appended, so a custom policy cannot
187
- break verdict scraping. May reference `{prompt}` (the solver task's prompt);
188
- if it doesn't, the task statement is appended after the policy."""
189
- hint: Path | str | None = None
190
- """Optional hints injected as their own section (inline text or a `.md`/
191
- `.txt` file): task-family pointers into the trace or box — e.g. for math,
192
- where the reference answer lives in the record; for SWE, to diff the repo
193
- or read `info.patch`."""
183
+ prompt: Path | None = None
184
+ """Grading-policy file. Replaces only the policy body the verdict contract
185
+ and workspace note are always appended. May reference `{prompt}` (the solver
186
+ task's prompt); if it doesn't, the task statement is appended after."""
187
+ hint: Path | None = None
188
+ """Optional hints file injected as their own section: task-family pointers
189
+ into the trace or box e.g. for math, where the reference answer lives in
190
+ the record; for SWE, to diff the repo or read `info.patch`."""
194
191
  rubric: Path | None = None
195
192
  """Criteria the judge grades against: a `.toml`/`.json` file with a
196
193
  `criteria` list — the plugged rubric judge's format, so the same rubric
197
194
  files work for both. None grades the single built-in `solved` criterion."""
198
195
 
199
- @staticmethod
200
- def _resolve(value: Path | str) -> str:
201
- path = Path(value)
202
- if isinstance(value, Path) or path.suffix in (".md", ".txt"):
203
- return path.read_text(encoding="utf-8")
204
- return str(value)
205
-
206
196
  def build_prompt(self) -> str:
207
197
  if self.prompt is None:
208
198
  return GRADE_PROMPT + "\n\n" + TASK_SECTION
209
- return self._resolve(self.prompt)
199
+ return self.prompt.read_text()
210
200
 
211
201
  def build_hint(self) -> str | None:
212
- return self._resolve(self.hint) if self.hint is not None else None
202
+ return self.hint.read_text() if self.hint is not None else None
213
203
 
214
204
  def criteria(self) -> list[Criterion]:
215
205
  if self.rubric is None:
216
206
  return [SOLVED]
217
- text = self.rubric.read_text(encoding="utf-8")
207
+ text = self.rubric.read_text()
218
208
  data = (
219
209
  tomllib.loads(text)
220
210
  if self.rubric.suffix.lower() == ".toml"
@@ -68,14 +68,10 @@ class GEPAAdapter:
68
68
  )
69
69
 
70
70
  async def _run_batch(self, batch: list[int], system_prompt: str) -> list[Episode]:
71
- # Inject the candidate by rebuilding each Task around a data row with the new
72
- # system_prompt (TaskData is frozen; behavior/config carry over unchanged).
73
- tasks = [
74
- type(t)(
75
- t.data.model_copy(update={"system_prompt": system_prompt}), t.config
76
- )
77
- for t in (self.tasks[idx] for idx in batch)
78
- ]
71
+ # Inject the candidate as a copy of each base task with its system_prompt overridden
72
+ # (`with_system_prompt` copies rather than reconstructs, so subclass state survives and
73
+ # the shared base task in `self.tasks` is left untouched for the next candidate).
74
+ tasks = [self.tasks[idx].with_system_prompt(system_prompt) for idx in batch]
79
75
  slots = [slot for task in tasks for slot in self.env.slots(task)]
80
76
  results = await asyncio.gather(
81
77
  *(
@@ -37,7 +37,10 @@ class _GEPALog:
37
37
 
38
38
  def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
39
39
  logger.info("gepa config:\n%s", config.model_dump_json(indent=2))
40
- all_tasks = env.taskset.select(config.num_train + config.num_val, config.shuffle)
40
+ # Global shuffle: an infinite taskset raises here — run it with
41
+ # shuffle=false (there is no whole set to sample from).
42
+ taskset = env.taskset.shuffle() if config.shuffle else env.taskset
43
+ all_tasks = list(taskset.head(config.num_train + config.num_val))
41
44
  train_tasks, val_tasks = split_tasks(all_tasks, config.num_train, config.num_val)
42
45
  selected_tasks = [*train_tasks, *val_tasks]
43
46
  # Seed from the tasks GEPA actually evaluates (train ∪ val), not the full pre-split pool —
@@ -105,7 +108,20 @@ def run_gepa(env: Env, config: GEPAConfig) -> GEPAResult:
105
108
  "skip_perfect_score": False,
106
109
  "logger": _GEPALog(),
107
110
  }
108
- return optimize(**optimize_kwargs)
111
+ result = optimize(**optimize_kwargs)
112
+ if run_dir is not None:
113
+ # Persist the winning prompt as a plain file so it can be handed straight to
114
+ # eval/train via `--env.taskset.system-prompt` (see TasksetConfig).
115
+ candidate = result.best_candidate
116
+ best = (
117
+ candidate.get("system_prompt", "")
118
+ if isinstance(candidate, dict)
119
+ else str(candidate)
120
+ )
121
+ best_path = run_dir / "best_system_prompt.txt"
122
+ best_path.write_text(best, encoding="utf-8")
123
+ logger.info("best system prompt: %s", best_path)
124
+ return result
109
125
  finally:
110
126
  loop.run_until_complete(serving.__aexit__(None, None, None))
111
127
  finally:
@@ -63,7 +63,7 @@ from verifiers.v1.configs.judge import (
63
63
  from verifiers.v1.dialects.chat import message_to_wire
64
64
  from verifiers.v1.scoring import parse_judge_choice
65
65
  from verifiers.v1.types import Messages, StrictBaseModel, Usage
66
- from verifiers.v1.utils.generic import generic_type
66
+ from verifiers.v1.utils.generic import concrete_type
67
67
 
68
68
  if TYPE_CHECKING:
69
69
  from verifiers.v1.task import TaskData
@@ -111,18 +111,18 @@ ConfigT = TypeVar("ConfigT", bound=JudgeConfig, default=JudgeConfig)
111
111
 
112
112
  def judge_config_cls(cls: type) -> type[JudgeConfig]:
113
113
  """Resolve a judge's config specialization through its MRO, else `JudgeConfig`."""
114
- return generic_type(cls, JudgeConfig) or JudgeConfig
114
+ return concrete_type(cls, JudgeConfig) or JudgeConfig
115
115
 
116
116
 
117
117
  class Judge(Generic[ParsedT, ConfigT]):
118
118
  prompt: str | None = None
119
- """Default prompt template, overridden by config."""
119
+ """Default prompt template, overridden by a config `prompt` file."""
120
120
  schema: type[BaseModel] | None = None
121
121
 
122
122
  def __init__(self, config: ConfigT | None = None) -> None:
123
123
  self.config = cast(ConfigT, config or judge_config_cls(type(self))())
124
- if self.config.prompt_file is not None:
125
- self.prompt = self.config.prompt_file.read_text(encoding="utf-8")
124
+ if self.config.prompt is not None:
125
+ self.prompt = self.config.prompt.read_text()
126
126
 
127
127
  @property
128
128
  def reward_name(self) -> str:
@@ -132,7 +132,7 @@ class Judge(Generic[ParsedT, ConfigT]):
132
132
  return judge_key(self.config) or fallback or "judge"
133
133
 
134
134
  def build_messages(self, **fields: Any) -> str | Messages:
135
- template = self.config.prompt or self.prompt
135
+ template = self.prompt
136
136
  if template is None:
137
137
  raise ValueError(
138
138
  f"{type(self).__name__} has no `prompt`; set it or override build_messages"
@@ -20,7 +20,7 @@ from verifiers.v1.harness import Harness
20
20
  from verifiers.v1.judge import Judge, judge_config_cls
21
21
  from verifiers.v1.task import Task
22
22
  from verifiers.v1.taskset import Taskset
23
- from verifiers.v1.utils.generic import generic_type, prefix_validation_error
23
+ from verifiers.v1.utils.generic import concrete_type, prefix_validation_error
24
24
  from verifiers.v1.utils.install import ensure_installed
25
25
 
26
26
 
@@ -208,7 +208,7 @@ def load_judge(config: JudgeConfig) -> Judge:
208
208
  def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
209
209
  """Resolve the taskset's config specialization through its MRO."""
210
210
  return (
211
- generic_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
211
+ concrete_type(taskset_class(taskset_id), TasksetConfig, origin=Taskset)
212
212
  or TasksetConfig
213
213
  )
214
214
 
@@ -216,7 +216,7 @@ def taskset_config_type(taskset_id: str) -> type[TasksetConfig]:
216
216
  def harness_config_type(harness_id: str) -> type[HarnessConfig]:
217
217
  """Resolve the harness's config specialization through its MRO."""
218
218
  return (
219
- generic_type(harness_class(harness_id), HarnessConfig, origin=Harness)
219
+ concrete_type(harness_class(harness_id), HarnessConfig, origin=Harness)
220
220
  or HarnessConfig
221
221
  )
222
222
 
@@ -231,7 +231,7 @@ def env_config_type(taskset_id: str, env_id: str = "") -> type[EnvConfig]:
231
231
  its MRO — `SingleAgentEnvConfig` for a plain taskset. The run's `env` field
232
232
  narrows to this, which is what gives `--env.<role>.model` addressing."""
233
233
  return (
234
- generic_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
234
+ concrete_type(environment_class(taskset_id, env_id), EnvConfig, origin=Env)
235
235
  or EnvConfig
236
236
  )
237
237
 
@@ -13,7 +13,7 @@ from pydantic import TypeAdapter, ValidationError
13
13
  from pydantic_config import BaseConfig
14
14
 
15
15
  from verifiers.v1.state import State, StateT, state_cls
16
- from verifiers.v1.utils.generic import generic_type
16
+ from verifiers.v1.utils.generic import concrete_type
17
17
 
18
18
  if TYPE_CHECKING:
19
19
  from httpx import AsyncClient, Response
@@ -286,7 +286,7 @@ class ServerBase(Generic[ConfigT, StateT]):
286
286
  @classmethod
287
287
  def _config_cls(cls) -> type[BaseConfig]:
288
288
  """Resolve the server's config specialization through its MRO."""
289
- if config_cls := generic_type(cls, BaseConfig):
289
+ if config_cls := concrete_type(cls, BaseConfig):
290
290
  return config_cls
291
291
  raise TypeError(
292
292
  f"{cls.__name__} must parameterize its config, e.g. Toolset[MyConfig]"
@@ -8,7 +8,7 @@ from pydantic import ConfigDict
8
8
  from typing_extensions import TypeVar
9
9
 
10
10
  from verifiers.v1.types import StrictBaseModel
11
- from verifiers.v1.utils.generic import generic_type
11
+ from verifiers.v1.utils.generic import concrete_type
12
12
 
13
13
 
14
14
  class State(StrictBaseModel):
@@ -20,4 +20,4 @@ StateT = TypeVar("StateT", bound=State, default=State)
20
20
 
21
21
  def state_cls(cls: type) -> type[State]:
22
22
  """Resolve a class's `State` specialization through its MRO, else `State`."""
23
- return generic_type(cls, State) or State
23
+ return concrete_type(cls, State) or State