verifiers 0.2.2.dev25__tar.gz → 0.2.2.dev26__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 (420) hide show
  1. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_e2e.py +18 -9
  3. verifiers-0.2.2.dev26/verifiers/v1/envs/agentic_judge/__init__.py +15 -0
  4. verifiers-0.2.2.dev26/verifiers/v1/envs/agentic_judge/env.py +347 -0
  5. verifiers-0.2.2.dev25/verifiers/v1/envs/agentic_judge/__init__.py +0 -3
  6. verifiers-0.2.2.dev25/verifiers/v1/envs/agentic_judge/env.py +0 -174
  7. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/.gitignore +0 -0
  8. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/LICENSE +0 -0
  9. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/README.md +0 -0
  10. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/pyproject.toml +0 -0
  11. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/__init__.py +0 -0
  12. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/conftest.py +0 -0
  13. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_browser_env.py +0 -0
  14. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_build_script.py +0 -0
  15. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_cli_agent_env.py +0 -0
  16. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_client_auth_errors.py +0 -0
  17. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_client_config.py +0 -0
  18. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_client_multimodal_types.py +0 -0
  19. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_composable_env.py +0 -0
  20. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_context_token_metrics.py +0 -0
  21. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_decorator_ranks.py +0 -0
  22. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_endpoint_registry.py +0 -0
  23. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_env_group.py +0 -0
  24. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_env_server.py +0 -0
  25. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_environment.py +0 -0
  26. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_environment_extra.py +0 -0
  27. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_error_chain.py +0 -0
  28. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_eval_display.py +0 -0
  29. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_eval_utils.py +0 -0
  30. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_gepa_cli.py +0 -0
  31. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_gepa_utils.py +0 -0
  32. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_gym_env.py +0 -0
  33. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_harbor_env_mcp.py +0 -0
  34. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_imports.py +0 -0
  35. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_init_script.py +0 -0
  36. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_install_utils.py +0 -0
  37. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_interception_utils.py +0 -0
  38. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_logging.py +0 -0
  39. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_math_rubric.py +0 -0
  40. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_maybe_think_parser.py +0 -0
  41. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_message_utils.py +0 -0
  42. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_message_utils_multimodal.py +0 -0
  43. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_multiturn_env.py +0 -0
  44. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_nemorl_client.py +0 -0
  45. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_openai_chat_completions_token_client.py +0 -0
  46. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_openai_responses_client.py +0 -0
  47. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_opencode_rlm_env.py +0 -0
  48. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_openenv_client.py +0 -0
  49. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_parser.py +0 -0
  50. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_path_utils.py +0 -0
  51. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_per_turn_timing.py +0 -0
  52. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_pricing_utils.py +0 -0
  53. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_prime_plugin.py +0 -0
  54. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_renderer_client.py +0 -0
  55. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_renderer_e2e.py +0 -0
  56. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_rlm_composable_env.py +0 -0
  57. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_rubric.py +0 -0
  58. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_rubric_group.py +0 -0
  59. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_sandbox_debug_env.py +0 -0
  60. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_sandbox_env.py +0 -0
  61. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_sandbox_mixin.py +0 -0
  62. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_save_utils.py +0 -0
  63. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_setup_script.py +0 -0
  64. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_singleturn_env.py +0 -0
  65. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_stateful_tool_env.py +0 -0
  66. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_think_parser.py +0 -0
  67. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_tool_env.py +0 -0
  68. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_tool_utils.py +0 -0
  69. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_trajectory_processing.py +0 -0
  70. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_tui_info_formatting.py +0 -0
  71. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_types.py +0 -0
  72. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/test_xml_parser.py +0 -0
  73. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/conftest.py +0 -0
  74. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  75. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/duet_v1.py +0 -0
  76. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  77. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  78. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  79. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  80. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  81. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_v0.py +0 -0
  82. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/echo_v1.py +0 -0
  83. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/pyproject.toml +0 -0
  84. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  85. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_color_codeword_tasks.py +0 -0
  86. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_configs.py +0 -0
  87. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_envs.py +0 -0
  88. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_graph.py +0 -0
  89. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_judges.py +0 -0
  90. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_legacy.py +0 -0
  91. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_scoring.py +0 -0
  92. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_taskset.py +0 -0
  93. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/tests/v1/test_trace.py +0 -0
  94. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/__init__.py +0 -0
  95. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/__init__.py +0 -0
  96. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/__init__.py +0 -0
  97. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/build.py +0 -0
  98. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/eval.py +0 -0
  99. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/gepa.py +0 -0
  100. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/init.py +0 -0
  101. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/install.py +0 -0
  102. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/commands/setup.py +0 -0
  103. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/plugins/__init__.py +0 -0
  104. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/plugins/prime.py +0 -0
  105. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/cli/tui.py +0 -0
  106. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/__init__.py +0 -0
  107. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/anthropic_messages_client.py +0 -0
  108. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/client.py +0 -0
  109. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  110. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/openai_chat_completions_client.py +0 -0
  111. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  112. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/openai_completions_client.py +0 -0
  113. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/openai_responses_client.py +0 -0
  114. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/clients/renderer_client.py +0 -0
  115. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/decorators.py +0 -0
  116. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/__init__.py +0 -0
  117. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/env_group.py +0 -0
  118. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/environment.py +0 -0
  119. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/README.md +0 -0
  120. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/__init__.py +0 -0
  121. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  122. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/README.md +0 -0
  123. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/__init__.py +0 -0
  124. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/_filter.py +0 -0
  125. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  126. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harness.py +0 -0
  127. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  128. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  129. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  130. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  131. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  132. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  133. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  134. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/task.py +0 -0
  135. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  136. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  137. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  138. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  139. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  140. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  141. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  142. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  143. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  144. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  145. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  146. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  147. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  148. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  149. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  150. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  151. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  152. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  153. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  154. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  155. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  156. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  157. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  158. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  159. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  160. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  161. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  162. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  163. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  164. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  165. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  166. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  167. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  168. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  169. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/gym_env.py +0 -0
  170. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  171. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  172. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  173. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/mcp_env.py +0 -0
  174. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/opencode_env.py +0 -0
  175. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  176. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  177. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  178. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/utils/__init__.py +0 -0
  179. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  180. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  181. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/README.md +0 -0
  182. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/__init__.py +0 -0
  183. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/README.md +0 -0
  184. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  185. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  186. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  187. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  188. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  189. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  190. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/openenv_env.py +0 -0
  191. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  192. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/integrations/textarena_env.py +0 -0
  193. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/multiturn_env.py +0 -0
  194. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/python_env.py +0 -0
  195. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/sandbox_env.py +0 -0
  196. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/singleturn_env.py +0 -0
  197. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/stateful_tool_env.py +0 -0
  198. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/envs/tool_env.py +0 -0
  199. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/errors.py +0 -0
  200. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/gepa/__init__.py +0 -0
  201. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/gepa/adapter.py +0 -0
  202. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/gepa/config.py +0 -0
  203. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/gepa/display.py +0 -0
  204. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/gepa/gepa_utils.py +0 -0
  205. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/parsers/__init__.py +0 -0
  206. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/parsers/maybe_think_parser.py +0 -0
  207. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/parsers/parser.py +0 -0
  208. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/parsers/think_parser.py +0 -0
  209. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/parsers/xml_parser.py +0 -0
  210. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/__init__.py +0 -0
  211. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  212. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/judge_rubric.py +0 -0
  213. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/math_rubric.py +0 -0
  214. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/rubric.py +0 -0
  215. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/rubrics/rubric_group.py +0 -0
  216. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/__init__.py +0 -0
  217. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/build.py +0 -0
  218. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/eval.py +0 -0
  219. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/gepa.py +0 -0
  220. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/init.py +0 -0
  221. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/install.py +0 -0
  222. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/setup.py +0 -0
  223. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/scripts/tui.py +0 -0
  224. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/__init__.py +0 -0
  225. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/client/env_client.py +0 -0
  226. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/client/zmq_env_client.py +0 -0
  227. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/server/__init__.py +0 -0
  228. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/server/env_router.py +0 -0
  229. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/server/env_server.py +0 -0
  230. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/server/env_worker.py +0 -0
  231. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/server/zmq_env_server.py +0 -0
  232. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/serve/types.py +0 -0
  233. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/types.py +0 -0
  234. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/__init__.py +0 -0
  235. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/async_utils.py +0 -0
  236. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/client_utils.py +0 -0
  237. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/config_utils.py +0 -0
  238. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/data_utils.py +0 -0
  239. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/display_utils.py +0 -0
  240. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/env_config_utils.py +0 -0
  241. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/env_utils.py +0 -0
  242. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/error_utils.py +0 -0
  243. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/eval_display.py +0 -0
  244. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/eval_utils.py +0 -0
  245. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/heartbeat.py +0 -0
  246. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/import_utils.py +0 -0
  247. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/install_utils.py +0 -0
  248. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/interception_utils.py +0 -0
  249. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/logging_utils.py +0 -0
  250. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/message_utils.py +0 -0
  251. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/metric_utils.py +0 -0
  252. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/path_utils.py +0 -0
  253. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/pricing_utils.py +0 -0
  254. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/process_utils.py +0 -0
  255. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/response_utils.py +0 -0
  256. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/save_utils.py +0 -0
  257. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/serve_utils.py +0 -0
  258. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/thread_utils.py +0 -0
  259. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/threaded_sandbox_client.py +0 -0
  260. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/tool_utils.py +0 -0
  261. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/usage_utils.py +0 -0
  262. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/utils/version_utils.py +0 -0
  263. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/__init__.py +0 -0
  264. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/acp/__init__.py +0 -0
  265. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/acp/_runner.py +0 -0
  266. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/agent.py +0 -0
  267. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/__init__.py +0 -0
  268. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  269. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/dashboard/base.py +0 -0
  270. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/dashboard/eval.py +0 -0
  271. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/dashboard/replay.py +0 -0
  272. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/dashboard/validate.py +0 -0
  273. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/debug.py +0 -0
  274. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/eval/__init__.py +0 -0
  275. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/eval/main.py +0 -0
  276. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/eval/resume.py +0 -0
  277. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/eval/runner.py +0 -0
  278. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/gepa.py +0 -0
  279. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/init.py +0 -0
  280. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/output.py +0 -0
  281. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/replay.py +0 -0
  282. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/resolve.py +0 -0
  283. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/serve.py +0 -0
  284. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/cli/validate.py +0 -0
  285. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/clients/__init__.py +0 -0
  286. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/clients/client.py +0 -0
  287. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/clients/config.py +0 -0
  288. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/clients/eval.py +0 -0
  289. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/clients/train.py +0 -0
  290. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/__init__.py +0 -0
  291. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/agent.py +0 -0
  292. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/__init__.py +0 -0
  293. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/debug.py +0 -0
  294. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/env.py +0 -0
  295. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/eval.py +0 -0
  296. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/init.py +0 -0
  297. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/replay.py +0 -0
  298. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/serve.py +0 -0
  299. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/cli/validate.py +0 -0
  300. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/env.py +0 -0
  301. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/harness.py +0 -0
  302. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/judge.py +0 -0
  303. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/retries.py +0 -0
  304. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/task.py +0 -0
  305. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/configs/taskset.py +0 -0
  306. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/decorators.py +0 -0
  307. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/dialects/__init__.py +0 -0
  308. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/dialects/anthropic.py +0 -0
  309. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/dialects/base.py +0 -0
  310. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/dialects/chat.py +0 -0
  311. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/dialects/responses.py +0 -0
  312. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/env.py +0 -0
  313. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/__init__.py +0 -0
  314. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  315. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/best_of_n/env.py +0 -0
  316. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  317. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/single_agent/env.py +0 -0
  318. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  319. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/envs/user_sim/env.py +0 -0
  320. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/episode.py +0 -0
  321. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/errors.py +0 -0
  322. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/__init__.py +0 -0
  323. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/adapter.py +0 -0
  324. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/config.py +0 -0
  325. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/dataset.py +0 -0
  326. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/reflection.py +0 -0
  327. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/gepa/runner.py +0 -0
  328. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/graph.py +0 -0
  329. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harness.py +0 -0
  330. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/__init__.py +0 -0
  331. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  332. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/bash/harness.py +0 -0
  333. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/bash/program.py +0 -0
  334. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  335. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  336. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  337. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/codex/harness.py +0 -0
  338. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  339. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  340. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  341. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  342. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  343. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/null/__init__.py +0 -0
  344. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/null/harness.py +0 -0
  345. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/null/program.py +0 -0
  346. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  347. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/pi/harness.py +0 -0
  348. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  349. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/pool/harness.py +0 -0
  350. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  351. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  352. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  353. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  354. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  355. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/__init__.py +0 -0
  356. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/base.py +0 -0
  357. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/pool.py +0 -0
  358. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/server.py +0 -0
  359. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  360. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/tunnel/base.py +0 -0
  361. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/tunnel/custom.py +0 -0
  362. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/interception/tunnel/prime.py +0 -0
  363. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judge.py +0 -0
  364. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judges/__init__.py +0 -0
  365. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judges/reference.py +0 -0
  366. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judges/reference.txt +0 -0
  367. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judges/rubric.py +0 -0
  368. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/judges/rubric.txt +0 -0
  369. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/legacy.py +0 -0
  370. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/loaders.py +0 -0
  371. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/mcp/__init__.py +0 -0
  372. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/mcp/launch.py +0 -0
  373. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/mcp/server.py +0 -0
  374. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/mcp/toolset.py +0 -0
  375. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/push.py +0 -0
  376. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/retries.py +0 -0
  377. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/rollout.py +0 -0
  378. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/__init__.py +0 -0
  379. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/base.py +0 -0
  380. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  381. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/docker/egress.py +0 -0
  382. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/limiters.py +0 -0
  383. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/modal.py +0 -0
  384. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/prime.py +0 -0
  385. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/runtimes/subprocess.py +0 -0
  386. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/scoring.py +0 -0
  387. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/serve/__init__.py +0 -0
  388. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/serve/client.py +0 -0
  389. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/serve/pool.py +0 -0
  390. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/serve/server.py +0 -0
  391. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/serve/types.py +0 -0
  392. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/session.py +0 -0
  393. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/state.py +0 -0
  394. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/task.py +0 -0
  395. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/taskset.py +0 -0
  396. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/__init__.py +0 -0
  397. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  398. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  399. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  400. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  401. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  402. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  403. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  404. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  405. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  406. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/trace.py +0 -0
  407. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/types.py +0 -0
  408. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/__init__.py +0 -0
  409. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/aio.py +0 -0
  410. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/compile.py +0 -0
  411. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/format.py +0 -0
  412. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/generic.py +0 -0
  413. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/git.py +0 -0
  414. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/image.py +0 -0
  415. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/install.py +0 -0
  416. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/interrupt.py +0 -0
  417. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/logging.py +0 -0
  418. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/memory.py +0 -0
  419. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/verifiers/v1/utils/sampling.py +0 -0
  420. {verifiers-0.2.2.dev25 → verifiers-0.2.2.dev26}/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.dev25
3
+ Version: 0.2.2.dev26
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
@@ -392,23 +392,32 @@ async def test_env_id_best_of_n(run_v1, tmp_path):
392
392
 
393
393
  @pytest.mark.e2e
394
394
  async def test_env_id_agentic_judge(run_v1, tmp_path):
395
- """The agentic judge over the echo taskset (needs docker): the judge lands in
396
- its own box with the graded transcript uploaded, investigates with real
397
- execution, and its parsed verdict lands on the solver's trace under the spec's
398
- reward key. Wiring, not taste: the judge followed the verdict-file contract's
399
- output contract the grade itself is the model's call."""
395
+ """The agentic judge over the echo taskset (needs docker): the box is
396
+ provisioned once from the solver's runtime policy, the solver plays in it,
397
+ the judge lands in the SAME box with the graded trace uploaded,
398
+ investigates with real execution, and its parsed verdict
399
+ lands on the solver's trace under the spec's reward key. Wiring, not taste:
400
+ the judge followed the verdict-file contract — the grade itself is the
401
+ model's call. Exercises the config surface too: a policy-only prompt
402
+ override (the verdict contract is appended regardless) and
403
+ reward-composition weights."""
400
404
  traces = await run_v1(
401
405
  "echo-v1",
402
406
  harness=None, # seats pin their own harness; there is no run-level one
403
407
  env={
404
408
  "id": "agentic-judge",
405
- "solver": {"harness": {"id": "null"}},
406
- # The judge reads the transcript and reasons before it writes the
409
+ # The solver owns the shared box, so the container is pinned here.
410
+ "solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
411
+ # The judge reads the trace and reasons before it writes the
407
412
  # verdict file; the shared 2048-token run cap truncates it mid-audit.
408
413
  "judge": {
409
- "runtime": {"type": "docker"},
414
+ "harness": {"id": "bash"},
410
415
  "max_output_tokens": 8192,
411
416
  },
417
+ "task": {
418
+ "prompt": "Check EMPIRICALLY that the agent echoed the word back.",
419
+ },
420
+ "score": {"task_weight": 0.5},
412
421
  },
413
422
  output_dir=tmp_path,
414
423
  max_turns=10,
@@ -419,7 +428,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
419
428
  (judge,) = [t for t in traces if t.agent_name == "judge"]
420
429
  assert solver.ok and judge.ok
421
430
  assert judge.trainable is False
422
- assert solver.rewards["echoed"] == 1.0 # the task's own reward still runs
431
+ assert solver.rewards["echoed"] == 0.5 # the task's own reward, rescaled
423
432
  assert isinstance(judge.info.get("verdict"), dict) # scraped off the box
424
433
  assert 0.0 <= solver.rewards["judge"] <= 1.0
425
434
 
@@ -0,0 +1,15 @@
1
+ from verifiers.v1.envs.agentic_judge.env import (
2
+ AgenticJudgeEnv,
3
+ AgenticJudgeEnvConfig,
4
+ Criterion,
5
+ JudgeTaskConfig,
6
+ ScoreConfig,
7
+ )
8
+
9
+ __all__ = [
10
+ "AgenticJudgeEnv",
11
+ "AgenticJudgeEnvConfig",
12
+ "Criterion",
13
+ "JudgeTaskConfig",
14
+ "ScoreConfig",
15
+ ]
@@ -0,0 +1,347 @@
1
+ """agentic-judge: a solver plays the task, a judge verifies it in the same box.
2
+
3
+ A reusable env (`--env.id agentic-judge` over any taskset): the box is
4
+ provisioned from the solver's runtime policy, the solver plays the task in it,
5
+ and a code-executing judge then inspects the work as the agent left it, with
6
+ the solver's full trace record uploaded at `/tmp/trace.json`. The judge grades
7
+ rubric criteria (`[env.task]`: policy prompt, criteria file) and writes its
8
+ verdicts to `/tmp/verdict.json`; `finalize()` validates them strictly onto the
9
+ solver's trace — `judge/<name>` metrics plus a weighted-mean `judge` reward,
10
+ composed with the taskset's own rewards via `[env.score]` (judge-only by
11
+ default).
12
+ """
13
+
14
+ import json
15
+ import math
16
+ import re
17
+ import tomllib
18
+ from pathlib import Path
19
+
20
+ from pydantic import field_validator
21
+
22
+ import verifiers.v1 as vf
23
+ from verifiers.v1.types import StrictBaseModel
24
+
25
+ VERDICT_FILE = "/tmp/verdict.json"
26
+ TRACE_FILE = "/tmp/trace.json"
27
+
28
+ GRADE_PROMPT = """\
29
+ You are grading another agent's attempt at a task. Verify the work EMPIRICALLY:
30
+ reconstruct what the agent did from its trace and test it with real execution
31
+ in your sandbox — never take the trace's word for an outcome you can check."""
32
+
33
+ TASK_SECTION = """\
34
+ ## The task the agent was given
35
+
36
+ {prompt}"""
37
+
38
+
39
+ class Criterion(StrictBaseModel):
40
+ """One rubric criterion — the plugged rubric judge's format, mirrored so the
41
+ same `criteria` files grade both judges."""
42
+
43
+ name: str
44
+ """Key for the criterion's metric (`judge/<name>`)."""
45
+ text: str
46
+ weight: float = 1.0
47
+ """The criterion's share of the reward."""
48
+ choices: list[str] = ["no", "yes"]
49
+ """Allowed answers, ordered **worst → best**: the first scores 0.0, the last 1.0, the rest
50
+ evenly spaced by rank. Default `["no", "yes"]` is a binary check. Needs >= 2, no duplicates."""
51
+
52
+ @field_validator("choices")
53
+ @classmethod
54
+ def _check_choices(cls, v: list[str]) -> list[str]:
55
+ if len(v) < 2:
56
+ raise ValueError(f"`choices` needs at least two options, got {v}")
57
+ if len(set(v)) != len(v):
58
+ raise ValueError(f"`choices` has duplicate options: {v}")
59
+ return v
60
+
61
+
62
+ SOLVED = Criterion(
63
+ name="solved",
64
+ text="The task is fully solved: what the task asked for is achieved, and "
65
+ "you verified it with real execution.",
66
+ )
67
+
68
+
69
+ def _verdict_section(criteria: list[Criterion]) -> str:
70
+ listing = "\n".join(
71
+ f"- {c.name}: {c.text} (answer one of, worst to best: {', '.join(c.choices)})"
72
+ for c in criteria
73
+ )
74
+ return f"""\
75
+ ## Your verdict
76
+
77
+ Grade the attempt on these criteria:
78
+
79
+ {listing}
80
+
81
+ When you are done verifying, write your verdict as JSON to `{VERDICT_FILE}`:
82
+
83
+ {{"verdicts": [{{"name": "<criterion name>", "reason": "<one sentence citing \
84
+ what you verified>", "verdict": "<answer>"}}, ...]}}
85
+
86
+ with one entry per criterion, using each criterion's exact name. For each, first
87
+ write the one-sentence reason grounded in what you actually verified, then set
88
+ verdict to exactly one of the options listed in parentheses after that
89
+ criterion."""
90
+
91
+
92
+ def _render(template: str, **fields: str) -> str:
93
+ """Substitute documented placeholders in one pass over the original template —
94
+ str.format would crash on any literal brace in a custom prompt, and sequential
95
+ replaces would re-scan substituted values. An unknown placeholder stays as written."""
96
+ pattern = re.compile(r"\{(" + "|".join(map(re.escape, fields)) + r")\}")
97
+ return pattern.sub(lambda m: fields[m.group(1)], template)
98
+
99
+
100
+ SANDBOX_NOTE = f"""\
101
+ ## Your workspace
102
+
103
+ Your sandbox is the SAME box the graded agent worked in, in the state the agent
104
+ left it — its edits (and any scoring side effects) are applied. The agent's raw
105
+ trace record (JSON: messages, tool calls, and its `info` artifacts) is uploaded
106
+ at `{TRACE_FILE}`. The record can be very large — never dump it whole; peek
107
+ selectively (list its keys, then slice out specific fields with python or jq)
108
+ and pull only what you need. It is complete — it may also carry the task's own
109
+ scores/metrics and reference material (a gold answer, a reference solution,
110
+ held-out tests). Those are context, not your standard: recorded scores can be
111
+ wrong and references can be narrower than the task; do not over-index on how a
112
+ reference solves it. Your verdict is what YOU verified by execution."""
113
+
114
+ HINT_SECTION = """\
115
+ ## Hints
116
+
117
+ {hint}"""
118
+
119
+
120
+ class JudgeTask(vf.Task):
121
+ """The judge's verdict task: the solver task's world mirrored onto the minted
122
+ row, the trace record written (and any stale verdict removed) before the
123
+ judge starts, verdict scraped off the live box after it exits. `NEEDS_CONTAINER`
124
+ keeps `Agent.run`'s per-task backstop aligned with the judge's declared need."""
125
+
126
+ NEEDS_CONTAINER = True
127
+
128
+ def __init__(self, data: vf.TaskData, files: dict[str, bytes]) -> None:
129
+ super().__init__(data)
130
+ self.files = files
131
+
132
+ @classmethod
133
+ def from_trace(cls, solution: vf.Trace, config: "JudgeTaskConfig") -> "JudgeTask":
134
+ """Mint the judge's task from the solver's finished trace."""
135
+ solved = solution.task.data
136
+ files = {TRACE_FILE: json.dumps(solution.to_record()).encode()}
137
+ template = config.build_prompt()
138
+ body = _render(template, prompt=solved.prompt_text)
139
+ if "{prompt}" not in template:
140
+ # A policy that doesn't place the task statement itself still needs it.
141
+ body += "\n\n" + _render(TASK_SECTION, prompt=solved.prompt_text)
142
+ sections = [body, _verdict_section(config.criteria()), SANDBOX_NOTE]
143
+ if (hint := config.build_hint()) is not None:
144
+ sections.insert(1, _render(HINT_SECTION, hint=hint))
145
+ prompt = "\n\n".join(sections)
146
+ return cls(
147
+ vf.TaskData(
148
+ idx=solved.idx,
149
+ prompt=prompt,
150
+ image=solved.image,
151
+ workdir=solved.workdir,
152
+ resources=solved.resources,
153
+ ),
154
+ files=files,
155
+ )
156
+
157
+ async def setup(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
158
+ # The solver had this box first: a pre-seeded verdict must never read as
159
+ # the judge's own, and a file (or planted symlink) at an upload path must
160
+ # never survive it — a symlinked TRACE_FILE would redirect the write onto
161
+ # any file the solver chose.
162
+ await runtime.run(["rm", "-f", VERDICT_FILE, *self.files], env={})
163
+ for path, content in self.files.items():
164
+ await runtime.write(path, content)
165
+
166
+ async def finalize(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
167
+ """Scrape the verdict off the box while it's alive. A judge that wrote no
168
+ file (or garbage) fails HERE — on the judge's own trace, the retryable
169
+ unit — never silently."""
170
+ try:
171
+ raw = await runtime.read(VERDICT_FILE)
172
+ except Exception as e:
173
+ raise ValueError(
174
+ f"the judge wrote no verdict to {VERDICT_FILE}; its final act must "
175
+ 'be writing {"verdicts": [{"name", "reason", "verdict"}, ...]} there'
176
+ ) from e
177
+ trace.info["verdict"] = json.loads(raw)
178
+
179
+
180
+ class JudgeTaskConfig(vf.BaseConfig):
181
+ """The judge's minted task: the grading policy and what lands in its box."""
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`."""
194
+ rubric: Path | None = None
195
+ """Criteria the judge grades against: a `.toml`/`.json` file with a
196
+ `criteria` list — the plugged rubric judge's format, so the same rubric
197
+ files work for both. None grades the single built-in `solved` criterion."""
198
+
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
+ def build_prompt(self) -> str:
207
+ if self.prompt is None:
208
+ return GRADE_PROMPT + "\n\n" + TASK_SECTION
209
+ return self._resolve(self.prompt)
210
+
211
+ def build_hint(self) -> str | None:
212
+ return self._resolve(self.hint) if self.hint is not None else None
213
+
214
+ def criteria(self) -> list[Criterion]:
215
+ if self.rubric is None:
216
+ return [SOLVED]
217
+ text = self.rubric.read_text(encoding="utf-8")
218
+ data = (
219
+ tomllib.loads(text)
220
+ if self.rubric.suffix.lower() == ".toml"
221
+ else json.loads(text)
222
+ )
223
+ items = data.get("criteria", []) if isinstance(data, dict) else data
224
+ criteria = [Criterion.model_validate(item) for item in items]
225
+ if not criteria:
226
+ raise ValueError(f"rubric file '{self.rubric}' lists no criteria")
227
+ names = [criterion.name for criterion in criteria]
228
+ if len(set(names)) != len(names):
229
+ raise ValueError(
230
+ f"rubric file '{self.rubric}' has duplicate criterion names"
231
+ )
232
+ if bad := [c.name for c in criteria if not 0 <= c.weight < math.inf]:
233
+ raise ValueError(
234
+ f"rubric '{self.rubric}' has negative or non-finite criterion "
235
+ f"weights: {bad}"
236
+ )
237
+ if sum(criterion.weight for criterion in criteria) <= 0:
238
+ raise ValueError(f"rubric '{self.rubric}' has no positive criterion weight")
239
+ return criteria
240
+
241
+
242
+ class ScoreConfig(vf.BaseConfig):
243
+ """How the judge's verdict composes with the taskset's own rewards on the
244
+ solver's trace. Judge-only by default."""
245
+
246
+ task_weight: float = 0.0
247
+ """Scale applied to the taskset's own rewards; 1 keeps them next to the verdict."""
248
+ judge_weight: float = 1.0
249
+ """Weight of the judge's verdict in the solver's reward."""
250
+
251
+
252
+ class AgenticJudgeEnvConfig(vf.EnvConfig):
253
+ solver: vf.AgentConfig = vf.AgentConfig()
254
+ """The solver agent. It owns the shared box, so its runtime must be a
255
+ container: `--env.solver.runtime.type docker|prime`."""
256
+ judge: vf.AgentConfig = vf.AgentConfig()
257
+ """The judge agent. It plays in the solver's box; its own runtime policy is
258
+ ignored (overwritten with the solver's)."""
259
+ task: JudgeTaskConfig = JudgeTaskConfig()
260
+ score: ScoreConfig = ScoreConfig()
261
+
262
+
263
+ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
264
+ def __init__(self, config: AgenticJudgeEnvConfig) -> None:
265
+ # The judge plays in the solver's box, so its effective runtime IS the
266
+ # solver's policy — aligning the config keeps the base env's subprocess
267
+ # warning and the runtime stamped on the judge's trace truthful.
268
+ config.judge = config.judge.model_copy(
269
+ update={"runtime": config.solver.runtime}
270
+ )
271
+ super().__init__(config)
272
+ self._check_agents()
273
+ # A missing policy file or a malformed rubric fails here, not mid-episode.
274
+ config.task.build_prompt()
275
+ config.task.build_hint()
276
+ config.task.criteria()
277
+
278
+ def _check_agents(self) -> None:
279
+ """The judge executes real code, never on the host — refuse an impossible
280
+ pairing at construction, not after burning a full solver run."""
281
+ judge = self._harnesses["judge"]
282
+ if not judge.EXECUTES_CODE:
283
+ raise ValueError(
284
+ "agentic-judge plays a code-executing judge in its own sandbox, but "
285
+ f"harness {judge.config.id!r} is a tool-less chat loop — a verdict "
286
+ "that needs no execution is a plugged judge "
287
+ "(--env.taskset.task.judges), not an agent."
288
+ )
289
+ if isinstance(self.config.solver.runtime, vf.SubprocessConfig):
290
+ raise ValueError(
291
+ "agentic-judge plays its judge in the solver's box, but the solver "
292
+ "(which provisions it) resolves to the subprocess runtime; use "
293
+ "--env.solver.runtime.type docker or prime"
294
+ )
295
+
296
+ async def setup(self, agents: vf.Agents) -> None:
297
+ # The judge grades the policy; its tokens are never training data.
298
+ agents.judge.trainable = False
299
+
300
+ async def run(self, task: vf.Task, agents: vf.Agents) -> None:
301
+ async with agents.solver.provision(task) as box:
302
+ solution = await agents.solver.run(task, runtime=box)
303
+ judge_task = JudgeTask.from_trace(solution, self.config.task)
304
+ await agents.judge.run(judge_task, runtime=box)
305
+
306
+ async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
307
+ by_agent = {t.agent_name: t for t in episode.traces}
308
+ solution, verdict = by_agent["solver"], by_agent["judge"]
309
+ data = verdict.info.get("verdict")
310
+ if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
311
+ raise ValueError(
312
+ f"no verdicts on the judge's trace (expected {VERDICT_FILE} with a "
313
+ '"verdicts" list)'
314
+ )
315
+ criteria = self.config.task.criteria()
316
+ by_criterion = {c.name: c for c in criteria}
317
+ answers: dict[str, str] = {}
318
+ for entry in data["verdicts"]:
319
+ if not isinstance(entry, dict):
320
+ raise ValueError(f"verdict entry {entry!r} is not an object")
321
+ name = str(entry.get("name"))
322
+ if name in answers:
323
+ # Contradictory duplicates must not collapse to whichever came last.
324
+ raise ValueError(f"judge answered criterion {name!r} more than once")
325
+ answers[name] = str(entry.get("verdict"))
326
+ if sorted(answers) != sorted(by_criterion):
327
+ raise ValueError(
328
+ f"judge verdicts name {sorted(answers)}, expected the rubric's "
329
+ f"{sorted(by_criterion)}"
330
+ )
331
+ scores: dict[str, float] = {}
332
+ for name, answer in answers.items():
333
+ choices = by_criterion[name].choices
334
+ # An off-menu answer is a judge failure, not a zero score.
335
+ if answer not in choices:
336
+ raise ValueError(
337
+ f"judge answered {answer!r} for '{name}', expected one of {choices}"
338
+ )
339
+ scores[name] = choices.index(answer) / (len(choices) - 1)
340
+ for criterion in criteria:
341
+ solution.record_metric(f"judge/{criterion.name}", scores[criterion.name])
342
+ if self.config.score.task_weight != 1.0:
343
+ for name in solution.rewards:
344
+ solution.rewards[name] *= self.config.score.task_weight
345
+ total = sum(criterion.weight for criterion in criteria)
346
+ reward = sum(c.weight * scores[c.name] for c in criteria) / total
347
+ solution.record_reward("judge", reward, weight=self.config.score.judge_weight)
@@ -1,3 +0,0 @@
1
- from verifiers.v1.envs.agentic_judge.env import AgenticJudgeEnv, AgenticJudgeEnvConfig
2
-
3
- __all__ = ["AgenticJudgeEnv", "AgenticJudgeEnvConfig"]
@@ -1,174 +0,0 @@
1
- """agentic-judge: a solver plays the task, a code-executing judge verifies it in a sandbox.
2
-
3
- Agent-as-judge as a reusable env (`--env.id agentic-judge` over any taskset). The
4
- judge's task mirrors the solver task's world — same image/workdir/resources, in a
5
- FRESH box in its original state (the solver's runtime is gone by judge time) —
6
- with the graded transcript uploaded, so the judge reconstructs and tests the work
7
- empirically, always in its own sandbox, never on the host.
8
-
9
- The verdict channel is a file, not the chat: the judge writes
10
- `{"score": 0-10, "reasoning": ...}` to `/tmp/verdict.json` in its box (a file
11
- survives a chatty final reply), `JudgeTask.finalize` scrapes it off the live
12
- runtime onto the judge's trace, and the env's `finalize()` validates it strictly
13
- onto the solver's trace — a missing, malformed, or off-scale verdict fails loudly instead
14
- of clamping to full marks.
15
- """
16
-
17
- import json
18
- import math
19
-
20
- import verifiers.v1 as vf
21
- from verifiers.v1.harness import Harness
22
-
23
- TRANSCRIPT_MD = "/tmp/transcript.md"
24
- TRANSCRIPT_JSON = "/tmp/transcript.json"
25
- VERDICT_FILE = "/tmp/verdict.json"
26
-
27
- GRADE_PROMPT = f"""\
28
- You are grading another agent's attempt at a task. Verify the work EMPIRICALLY:
29
- reconstruct what the agent did from its transcript and test it with real
30
- execution in your sandbox — never take the transcript's word for an outcome you
31
- can check.
32
-
33
- ## The task the agent was given
34
-
35
- {{prompt}}
36
-
37
- ## Your verdict
38
-
39
- When you are done verifying, write your verdict as JSON to `{VERDICT_FILE}`:
40
-
41
- {{{{"score": <integer 0-10>, "reasoning": "<one paragraph>"}}}}
42
-
43
- 10 = the task is fully solved (you verified it); 0 = no progress. The score MUST
44
- be an integer between 0 and 10 — nothing else is accepted."""
45
-
46
-
47
- def _sandbox_note(solver: vf.TaskData) -> str:
48
- """What an agentic judge must know about its box before it starts verifying."""
49
- world = (
50
- f"a fresh instance of the same environment the graded agent worked in "
51
- f"(image {solver.image}), in its ORIGINAL state — the agent's edits are "
52
- "NOT applied; reconstruct them from the transcript to verify"
53
- if solver.image is not None
54
- else "your own — the graded agent worked elsewhere"
55
- )
56
- return (
57
- f"\n\n## Your workspace\nYour sandbox is {world}. The agent's full transcript "
58
- f"is uploaded at {TRANSCRIPT_MD} (rendered) and {TRANSCRIPT_JSON} (the raw "
59
- "trace record)."
60
- )
61
-
62
-
63
- class JudgeTask(vf.Task):
64
- """The judge's verdict task: the solver task's world mirrored onto the minted
65
- row, transcript uploaded (and any stale verdict removed) before the judge
66
- starts, verdict scraped off the live box after it exits. `NEEDS_CONTAINER`
67
- keeps `Agent.run`'s per-task backstop aligned with the judge's declared need."""
68
-
69
- NEEDS_CONTAINER = True
70
-
71
- def __init__(self, data: vf.TaskData, files: dict[str, bytes]) -> None:
72
- super().__init__(data)
73
- self._files = files
74
-
75
- @classmethod
76
- def from_trace(cls, task: vf.Task, solution: vf.Trace) -> "JudgeTask":
77
- """Mint the judge's task from the solver's finished trace."""
78
- prompt = GRADE_PROMPT.format(prompt=task.data.prompt_text)
79
- return cls(
80
- vf.TaskData(
81
- idx=task.data.idx,
82
- prompt=prompt + _sandbox_note(task.data),
83
- image=task.data.image,
84
- workdir=task.data.workdir,
85
- resources=task.data.resources,
86
- ),
87
- files={
88
- TRANSCRIPT_MD: solution.transcript.encode(),
89
- TRANSCRIPT_JSON: json.dumps(solution.to_record()).encode(),
90
- },
91
- )
92
-
93
- async def setup(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
94
- # A pre-seeded verdict (baked into the image) must never read as the
95
- # judge's own; remove it before the judge starts.
96
- await runtime.run(["rm", "-f", VERDICT_FILE], env={})
97
- for path, content in self._files.items():
98
- await runtime.write(path, content)
99
-
100
- async def finalize(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
101
- """Scrape the verdict off the box while it's alive. A judge that wrote no
102
- file (or garbage) fails HERE — on the judge's own trace, the retryable
103
- unit — never silently."""
104
- try:
105
- raw = await runtime.read(VERDICT_FILE)
106
- except Exception as e:
107
- raise ValueError(
108
- f"the judge wrote no verdict to {VERDICT_FILE}; its final act must "
109
- 'be writing {"score": <0-10>, "reasoning": ...} there'
110
- ) from e
111
- trace.info["verdict"] = json.loads(raw)
112
-
113
-
114
- class AgenticJudgeEnvConfig(vf.EnvConfig):
115
- solver: vf.AgentConfig = vf.AgentConfig()
116
- judge: vf.AgentConfig = vf.AgentConfig()
117
- """The judge agent. Its runtime must be a container:
118
- `--env.judge.runtime.type docker|prime`."""
119
-
120
-
121
- class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
122
- def __init__(self, config: AgenticJudgeEnvConfig) -> None:
123
- super().__init__(config)
124
- self._check_judge(self._harnesses["judge"], config.judge)
125
-
126
- def _check_judge(self, harness: Harness, judge: vf.AgentConfig) -> None:
127
- """The judge executes real code, never on the host — refuse an impossible
128
- judge at construction, not after burning a full solver run."""
129
- if not harness.EXECUTES_CODE:
130
- raise ValueError(
131
- "agentic-judge plays a code-executing judge in its own sandbox, but "
132
- f"harness {harness.config.id!r} is a tool-less chat loop — a verdict "
133
- "that needs no execution is a plugged judge "
134
- "(--env.taskset.task.judges), not an agent."
135
- )
136
- if isinstance(judge.runtime, vf.SubprocessConfig):
137
- raise ValueError(
138
- "agentic-judge plays its judge in a container (JudgeTask mirrors "
139
- "the solver task's image), but the judge resolves to the "
140
- "subprocess runtime; use --env.judge.runtime.type docker "
141
- "or prime."
142
- )
143
-
144
- async def setup(self, agents: vf.Agents) -> None:
145
- # The judge grades the policy; its tokens are never training data.
146
- agents.judge.trainable = False
147
-
148
- async def run(self, task: vf.Task, agents: vf.Agents) -> None:
149
- solution = await agents.solver.run(task)
150
- await agents.judge.run(JudgeTask.from_trace(task, solution))
151
-
152
- async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
153
- """Record the scraped verdict on the SOLVER's trace. Strict on scale: an
154
- off-scale score raises (a judge answering `95` must not clamp to full
155
- marks), failing the episode rather than scoring the solver wrong."""
156
- by_agent = {t.agent_name: t for t in episode.traces}
157
- solution, verdict = by_agent["solver"], by_agent["judge"]
158
- data = verdict.info.get("verdict")
159
- if not isinstance(data, dict):
160
- raise ValueError(
161
- f"no verdict on the judge's trace (expected {VERDICT_FILE})"
162
- )
163
- score = data.get("score")
164
- if (
165
- not isinstance(score, (int, float))
166
- or isinstance(score, bool)
167
- or math.isnan(float(score))
168
- or not 0 <= float(score) <= 10
169
- ):
170
- raise ValueError(
171
- f"verdict score {score!r} is not on the 0-10 scale; refusing to "
172
- "clamp or coerce it"
173
- )
174
- solution.record_reward("judge", float(score) / 10.0)
File without changes