verifiers 0.2.2.dev52__tar.gz → 0.2.2.dev53__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 (421) hide show
  1. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_e2e.py +7 -6
  3. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/__init__.py +11 -0
  4. verifiers-0.2.2.dev53/verifiers/v1/artifacts.py +144 -0
  5. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/agentic_judge/__init__.py +2 -0
  6. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/agentic_judge/env.py +120 -52
  7. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/state.py +3 -2
  8. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/task.py +6 -0
  9. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/harbor/taskset.py +99 -0
  10. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/git.py +74 -9
  11. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/.gitignore +0 -0
  12. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/LICENSE +0 -0
  13. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/README.md +0 -0
  14. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/pyproject.toml +0 -0
  15. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/__init__.py +0 -0
  16. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/conftest.py +0 -0
  17. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_browser_env.py +0 -0
  18. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_build_script.py +0 -0
  19. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_cli_agent_env.py +0 -0
  20. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_client_auth_errors.py +0 -0
  21. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_client_config.py +0 -0
  22. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_client_multimodal_types.py +0 -0
  23. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_composable_env.py +0 -0
  24. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_context_token_metrics.py +0 -0
  25. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_decorator_ranks.py +0 -0
  26. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_endpoint_registry.py +0 -0
  27. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_env_group.py +0 -0
  28. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_env_server.py +0 -0
  29. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_environment.py +0 -0
  30. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_environment_extra.py +0 -0
  31. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_error_chain.py +0 -0
  32. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_eval_display.py +0 -0
  33. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_eval_utils.py +0 -0
  34. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_gepa_cli.py +0 -0
  35. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_gepa_utils.py +0 -0
  36. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_gym_env.py +0 -0
  37. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_harbor_env_mcp.py +0 -0
  38. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_imports.py +0 -0
  39. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_init_script.py +0 -0
  40. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_install_utils.py +0 -0
  41. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_interception_utils.py +0 -0
  42. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_logging.py +0 -0
  43. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_parser.py +0 -0
  54. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_rubric.py +0 -0
  62. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_types.py +0 -0
  76. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/test_xml_parser.py +0 -0
  77. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/conftest.py +0 -0
  78. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  79. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/duet_v1.py +0 -0
  80. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  81. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  82. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  83. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  84. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  85. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_v0.py +0 -0
  86. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/echo_v1.py +0 -0
  87. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/pyproject.toml +0 -0
  88. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  89. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_color_codeword_tasks.py +0 -0
  90. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_configs.py +0 -0
  91. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_envs.py +0 -0
  92. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_graph.py +0 -0
  93. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_judges.py +0 -0
  94. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_legacy.py +0 -0
  95. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_scoring.py +0 -0
  96. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_taskset.py +0 -0
  97. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/tests/v1/test_trace.py +0 -0
  98. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/__init__.py +0 -0
  99. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/__init__.py +0 -0
  100. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/__init__.py +0 -0
  101. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/build.py +0 -0
  102. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/eval.py +0 -0
  103. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/gepa.py +0 -0
  104. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/init.py +0 -0
  105. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/install.py +0 -0
  106. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/commands/setup.py +0 -0
  107. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/plugins/__init__.py +0 -0
  108. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/plugins/prime.py +0 -0
  109. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/cli/tui.py +0 -0
  110. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/__init__.py +0 -0
  111. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/anthropic_messages_client.py +0 -0
  112. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/client.py +0 -0
  113. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  114. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/openai_chat_completions_client.py +0 -0
  115. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  116. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/openai_completions_client.py +0 -0
  117. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/openai_responses_client.py +0 -0
  118. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/clients/renderer_client.py +0 -0
  119. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/decorators.py +0 -0
  120. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/__init__.py +0 -0
  121. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/env_group.py +0 -0
  122. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/environment.py +0 -0
  123. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/README.md +0 -0
  124. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/__init__.py +0 -0
  125. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  126. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/README.md +0 -0
  127. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/__init__.py +0 -0
  128. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/_filter.py +0 -0
  129. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  130. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harness.py +0 -0
  131. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  132. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  133. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  134. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  135. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  136. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  137. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  138. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/task.py +0 -0
  139. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  140. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  141. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  142. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  143. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  144. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  145. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  146. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  147. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  150. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  151. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  152. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  153. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  154. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  155. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  156. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  157. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  158. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  159. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  160. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  161. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  162. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  163. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  164. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  165. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  166. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  167. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  168. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  169. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  170. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  171. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  172. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  173. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/gym_env.py +0 -0
  174. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  175. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  176. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  177. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/mcp_env.py +0 -0
  178. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_env.py +0 -0
  179. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  180. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  181. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  182. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/__init__.py +0 -0
  183. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  184. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  185. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/README.md +0 -0
  186. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/__init__.py +0 -0
  187. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/README.md +0 -0
  188. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  189. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  190. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  191. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  192. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  193. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  194. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/openenv_env.py +0 -0
  195. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  196. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/integrations/textarena_env.py +0 -0
  197. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/multiturn_env.py +0 -0
  198. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/python_env.py +0 -0
  199. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/sandbox_env.py +0 -0
  200. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/singleturn_env.py +0 -0
  201. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/stateful_tool_env.py +0 -0
  202. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/envs/tool_env.py +0 -0
  203. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/errors.py +0 -0
  204. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/gepa/__init__.py +0 -0
  205. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/gepa/adapter.py +0 -0
  206. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/gepa/config.py +0 -0
  207. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/gepa/display.py +0 -0
  208. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/gepa/gepa_utils.py +0 -0
  209. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/parsers/__init__.py +0 -0
  210. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/parsers/maybe_think_parser.py +0 -0
  211. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/parsers/parser.py +0 -0
  212. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/parsers/think_parser.py +0 -0
  213. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/parsers/xml_parser.py +0 -0
  214. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/__init__.py +0 -0
  215. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  216. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/judge_rubric.py +0 -0
  217. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/math_rubric.py +0 -0
  218. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/rubric.py +0 -0
  219. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/rubrics/rubric_group.py +0 -0
  220. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/__init__.py +0 -0
  221. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/build.py +0 -0
  222. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/eval.py +0 -0
  223. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/gepa.py +0 -0
  224. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/init.py +0 -0
  225. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/install.py +0 -0
  226. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/setup.py +0 -0
  227. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/scripts/tui.py +0 -0
  228. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/__init__.py +0 -0
  229. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/client/env_client.py +0 -0
  230. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/client/zmq_env_client.py +0 -0
  231. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/server/__init__.py +0 -0
  232. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_router.py +0 -0
  233. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_server.py +0 -0
  234. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/server/env_worker.py +0 -0
  235. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/server/zmq_env_server.py +0 -0
  236. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/serve/types.py +0 -0
  237. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/types.py +0 -0
  238. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/__init__.py +0 -0
  239. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/async_utils.py +0 -0
  240. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/client_utils.py +0 -0
  241. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/config_utils.py +0 -0
  242. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/data_utils.py +0 -0
  243. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/display_utils.py +0 -0
  244. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/env_config_utils.py +0 -0
  245. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/env_utils.py +0 -0
  246. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/error_utils.py +0 -0
  247. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/eval_display.py +0 -0
  248. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/eval_utils.py +0 -0
  249. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/heartbeat.py +0 -0
  250. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/import_utils.py +0 -0
  251. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/install_utils.py +0 -0
  252. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/interception_utils.py +0 -0
  253. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/logging_utils.py +0 -0
  254. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/message_utils.py +0 -0
  255. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/metric_utils.py +0 -0
  256. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/path_utils.py +0 -0
  257. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/pricing_utils.py +0 -0
  258. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/process_utils.py +0 -0
  259. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/response_utils.py +0 -0
  260. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/save_utils.py +0 -0
  261. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/serve_utils.py +0 -0
  262. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/thread_utils.py +0 -0
  263. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/threaded_sandbox_client.py +0 -0
  264. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/tool_utils.py +0 -0
  265. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/usage_utils.py +0 -0
  266. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/utils/version_utils.py +0 -0
  267. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/acp/__init__.py +0 -0
  268. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/acp/_runner.py +0 -0
  269. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/agent.py +0 -0
  270. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/__init__.py +0 -0
  271. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  272. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/base.py +0 -0
  273. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/eval.py +0 -0
  274. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/replay.py +0 -0
  275. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/dashboard/validate.py +0 -0
  276. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/debug.py +0 -0
  277. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/__init__.py +0 -0
  278. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/main.py +0 -0
  279. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/resume.py +0 -0
  280. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/eval/runner.py +0 -0
  281. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/gepa.py +0 -0
  282. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/init.py +0 -0
  283. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/output.py +0 -0
  284. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/replay.py +0 -0
  285. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/resolve.py +0 -0
  286. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/serve.py +0 -0
  287. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/cli/validate.py +0 -0
  288. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/clients/__init__.py +0 -0
  289. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/clients/client.py +0 -0
  290. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/clients/config.py +0 -0
  291. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/clients/eval.py +0 -0
  292. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/clients/train.py +0 -0
  293. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/__init__.py +0 -0
  294. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/agent.py +0 -0
  295. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/__init__.py +0 -0
  296. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/debug.py +0 -0
  297. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/env.py +0 -0
  298. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/eval.py +0 -0
  299. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/init.py +0 -0
  300. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/replay.py +0 -0
  301. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/serve.py +0 -0
  302. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/cli/validate.py +0 -0
  303. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/env.py +0 -0
  304. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/harness.py +0 -0
  305. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/judge.py +0 -0
  306. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/legacy.py +0 -0
  307. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/retries.py +0 -0
  308. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/serve.py +0 -0
  309. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/task.py +0 -0
  310. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/configs/taskset.py +0 -0
  311. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/decorators.py +0 -0
  312. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/__init__.py +0 -0
  313. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/anthropic.py +0 -0
  314. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/base.py +0 -0
  315. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/chat.py +0 -0
  316. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/dialects/responses.py +0 -0
  317. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/env.py +0 -0
  318. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/__init__.py +0 -0
  319. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  320. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/best_of_n/env.py +0 -0
  321. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  322. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/single_agent/env.py +0 -0
  323. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  324. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/envs/user_sim/env.py +0 -0
  325. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/episode.py +0 -0
  326. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/errors.py +0 -0
  327. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/__init__.py +0 -0
  328. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/adapter.py +0 -0
  329. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/config.py +0 -0
  330. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/dataset.py +0 -0
  331. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/reflection.py +0 -0
  332. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/gepa/runner.py +0 -0
  333. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/graph.py +0 -0
  334. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harness.py +0 -0
  335. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/__init__.py +0 -0
  336. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  337. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/harness.py +0 -0
  338. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/bash/program.py +0 -0
  339. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  340. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  341. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  342. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/codex/harness.py +0 -0
  343. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  344. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  345. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  346. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  347. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  348. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/__init__.py +0 -0
  349. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/harness.py +0 -0
  350. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/null/program.py +0 -0
  351. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  352. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pi/harness.py +0 -0
  353. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  354. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/pool/harness.py +0 -0
  355. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  356. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  357. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  358. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  359. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  360. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/__init__.py +0 -0
  361. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/base.py +0 -0
  362. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/pool.py +0 -0
  363. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/server.py +0 -0
  364. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  365. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/base.py +0 -0
  366. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/custom.py +0 -0
  367. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/interception/tunnel/prime.py +0 -0
  368. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judge.py +0 -0
  369. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judges/__init__.py +0 -0
  370. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judges/reference.py +0 -0
  371. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judges/reference.txt +0 -0
  372. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judges/rubric.py +0 -0
  373. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/judges/rubric.txt +0 -0
  374. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/legacy.py +0 -0
  375. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/loaders.py +0 -0
  376. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/__init__.py +0 -0
  377. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/launch.py +0 -0
  378. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/server.py +0 -0
  379. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/mcp/toolset.py +0 -0
  380. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/push.py +0 -0
  381. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/retries.py +0 -0
  382. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/rollout.py +0 -0
  383. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/__init__.py +0 -0
  384. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/base.py +0 -0
  385. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  386. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/docker/egress.py +0 -0
  387. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/limiters.py +0 -0
  388. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/modal.py +0 -0
  389. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/prime.py +0 -0
  390. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/runtimes/subprocess.py +0 -0
  391. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/scoring.py +0 -0
  392. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/serve/__init__.py +0 -0
  393. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/serve/client.py +0 -0
  394. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/serve/pool.py +0 -0
  395. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/serve/server.py +0 -0
  396. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/serve/types.py +0 -0
  397. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/session.py +0 -0
  398. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/taskset.py +0 -0
  399. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/__init__.py +0 -0
  400. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  401. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  402. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  403. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  404. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  405. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  406. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  407. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  408. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/trace.py +0 -0
  409. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/types.py +0 -0
  410. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/__init__.py +0 -0
  411. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/aio.py +0 -0
  412. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/compile.py +0 -0
  413. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/format.py +0 -0
  414. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/generic.py +0 -0
  415. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/image.py +0 -0
  416. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/install.py +0 -0
  417. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/interrupt.py +0 -0
  418. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/logging.py +0 -0
  419. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/memory.py +0 -0
  420. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/verifiers/v1/utils/sampling.py +0 -0
  421. {verifiers-0.2.2.dev52 → verifiers-0.2.2.dev53}/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.dev52
3
+ Version: 0.2.2.dev53
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
@@ -335,6 +335,7 @@ async def test_agentic(run_v1, harness, harness_runtime, tmp_path):
335
335
  runtime={"type": harness_runtime},
336
336
  output_dir=tmp_path,
337
337
  max_turns=10,
338
+ max_tokens=8192,
338
339
  )
339
340
  assert trace.ok
340
341
  assert trace.num_turns >= 1 # ran a command, then finished
@@ -405,18 +406,18 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
405
406
  policy.write_text("Check EMPIRICALLY that the agent echoed the word back.")
406
407
  traces = await run_v1(
407
408
  "echo-v1",
408
- harness=None, # seats pin their own harness; there is no run-level one
409
+ harness=None,
409
410
  env={
410
411
  "id": "agentic-judge",
411
- # The solver owns the shared box, so the container is pinned here.
412
412
  "solver": {"harness": {"id": "bash"}, "runtime": {"type": "docker"}},
413
- # The judge reads the trace and reasons before it writes the
414
- # verdict file; the shared 2048-token run cap truncates it mid-audit.
415
413
  "judge": {
416
414
  "harness": {"id": "bash"},
417
415
  "max_output_tokens": 8192,
418
416
  },
419
- "task": {"prompt": str(policy)},
417
+ "task": {
418
+ "prompt": {"path": str(policy)},
419
+ "hint": "Do not rely on README.md",
420
+ },
420
421
  "score": {"task_weight": 0.5},
421
422
  },
422
423
  output_dir=tmp_path,
@@ -431,7 +432,7 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
431
432
  # The task's own reward keeps its raw score; the rescale lands on the weight.
432
433
  assert solver.rewards["echoed"].score == 1.0
433
434
  assert solver.rewards["echoed"].weight == 0.5
434
- assert isinstance(judge.info.get("verdict"), dict) # scraped off the box
435
+ assert isinstance(judge.info.get("verdict"), dict)
435
436
  assert 0.0 <= solver.rewards["judge"].score <= 1.0
436
437
 
437
438
 
@@ -4,6 +4,12 @@ from pydantic_config import BaseConfig
4
4
 
5
5
  from verifiers.v1.acp import ACP
6
6
  from verifiers.v1.agent import Agent, Agents, Interaction, Segment, make_agent
7
+ from verifiers.v1.artifacts import (
8
+ ARTIFACTS_DIR,
9
+ Artifact,
10
+ collect,
11
+ restore,
12
+ )
7
13
  from verifiers.v1.clients import (
8
14
  BaseClientConfig,
9
15
  Client,
@@ -297,6 +303,11 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
297
303
  "PATCH_CAP_BYTES",
298
304
  "capture_patch",
299
305
  "resolve_head",
306
+ # grading artifacts
307
+ "ARTIFACTS_DIR",
308
+ "Artifact",
309
+ "collect",
310
+ "restore",
300
311
  # scoring
301
312
  "compare_stdout_results",
302
313
  "extract_boxed_answer",
@@ -0,0 +1,144 @@
1
+ """Artifact collection and restoration across runtimes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import shlex
7
+ import uuid
8
+ from pathlib import PurePosixPath
9
+ from typing import TYPE_CHECKING
10
+
11
+ from pydantic import Field
12
+
13
+ from verifiers.v1.types import StrictBaseModel
14
+
15
+ if TYPE_CHECKING:
16
+ from verifiers.v1.runtimes import Runtime
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ ARTIFACTS_DIR = "/logs/artifacts"
21
+ """Implicit artifact directory; tasks that write here need no declaration."""
22
+
23
+ MAX_ARTIFACT_BYTES = 32 * 1024 * 1024
24
+ """Ceiling per collection. Sized for a delta, not a tree: the grading box boots from the
25
+ agent's image, so the repo is already there and only its output has to travel."""
26
+
27
+
28
+ class Artifact(StrictBaseModel):
29
+ """One path to restore at the same location in another runtime."""
30
+
31
+ source: str
32
+ exclude: list[str] = Field(default_factory=list)
33
+ """`tar --exclude` patterns, applied when `source` is a directory."""
34
+
35
+
36
+ async def collect(
37
+ runtime: Runtime, artifacts: list[Artifact] | None = None
38
+ ) -> dict[str, bytes]:
39
+ """Tar the convention dir and every declared path out of `runtime`.
40
+
41
+ Keyed by source path; the values are tar archives. Insertion order is the order
42
+ they were declared, and a path cannot be collected twice.
43
+
44
+ A declared source that is missing raises: it was declared because grading needs it,
45
+ and grading a partial state scores the rollout wrong rather than failing it. The
46
+ implicit convention sweep is exempt — most tasks never write there.
47
+
48
+ Each source is archived separately so its exclude patterns stay local.
49
+ """
50
+ # Resolve relative sources against the runtime workdir. Joining also normalises
51
+ # `/work/` to `/work`, so one tree cannot key two entries (the source is both the
52
+ # dict key and `restore`'s rm -rf target).
53
+ workdir = PurePosixPath(getattr(runtime.config, "workdir", "") or "/")
54
+ declared = [
55
+ a.model_copy(update={"source": str(workdir / a.source)})
56
+ for a in artifacts or []
57
+ ]
58
+ convention = PurePosixPath(ARTIFACTS_DIR)
59
+ sweep = not any(
60
+ (p := PurePosixPath(a.source)) == convention
61
+ or p.is_relative_to(convention)
62
+ or convention.is_relative_to(p)
63
+ for a in declared
64
+ )
65
+ entries = ([Artifact(source=ARTIFACTS_DIR)] if sweep else []) + declared
66
+
67
+ collected: dict[str, bytes] = {}
68
+ budget = MAX_ARTIFACT_BYTES
69
+ for artifact in entries:
70
+ source = artifact.source
71
+ if (await runtime.run(["test", "-e", source], {})).exit_code != 0:
72
+ if sweep and source == ARTIFACTS_DIR:
73
+ continue
74
+ raise RuntimeError(
75
+ f"declared artifact {source!r} does not exist in the runtime"
76
+ )
77
+ archive = await _tar_out(runtime, artifact, budget)
78
+ budget -= len(archive)
79
+ collected[source] = archive
80
+
81
+ logger.debug("collected artifact roots: %s", list(collected))
82
+ return collected
83
+
84
+
85
+ async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
86
+ """Extract `collected` in `runtime` at the original absolute paths."""
87
+ if not collected:
88
+ return
89
+ # Restoring into the subprocess runtime would extract absolute paths onto the
90
+ # developer's filesystem, so refuse it before any archive reaches the host.
91
+ if getattr(runtime.config, "type", None) == "subprocess":
92
+ raise RuntimeError(
93
+ "refusing to restore artifacts into the subprocess runtime: extraction "
94
+ "writes to absolute paths on the host. Grade in a container."
95
+ )
96
+ # Clear every root up front, not per entry: a later nested root would otherwise
97
+ # delete content an earlier one just restored. Clearing also drops any file or
98
+ # symlink the image left at the target.
99
+ roots = " ".join(shlex.quote(root) for root in collected)
100
+ await _run(runtime, f"rm -rf -- {roots}", "clear artifact roots")
101
+ for root, archive in collected.items():
102
+ path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
103
+ await runtime.write(path, archive)
104
+ await _run(
105
+ runtime,
106
+ f"tar -xf {shlex.quote(path)} -C / && rm -f {shlex.quote(path)}",
107
+ f"restore artifact {root!r}",
108
+ )
109
+
110
+
111
+ async def _tar_out(runtime: Runtime, artifact: Artifact, budget: int) -> bytes:
112
+ path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
113
+ excludes = " ".join(f"--exclude={shlex.quote(p)}" for p in artifact.exclude)
114
+ try:
115
+ await _run(
116
+ runtime,
117
+ f"tar -cf {shlex.quote(path)} -C / {excludes} -- "
118
+ f"{shlex.quote(artifact.source.lstrip('/'))}",
119
+ f"collect artifact {artifact.source!r}",
120
+ )
121
+ # Size it in the box: an oversized collection is refused before it reaches host
122
+ # memory, not after.
123
+ sized = await runtime.run(["sh", "-c", f"wc -c < {shlex.quote(path)}"], {})
124
+ if (raw := sized.stdout.strip()).isdigit() and int(raw) > budget:
125
+ raise RuntimeError(
126
+ f"artifact {artifact.source!r} takes the collection over the "
127
+ f"{MAX_ARTIFACT_BYTES} byte limit. The grading box boots from the "
128
+ "agent's image, so only the delta needs to travel — narrow the source "
129
+ "or add `exclude` patterns."
130
+ )
131
+ return await runtime.read(path)
132
+ finally:
133
+ # Best-effort: the box is about to be destroyed and the name is unique per call.
134
+ try:
135
+ await runtime.run(["rm", "-f", path], {})
136
+ except Exception:
137
+ logger.debug("failed to remove %s", path, exc_info=True)
138
+
139
+
140
+ async def _run(runtime: Runtime, command: str, action: str) -> None:
141
+ result = await runtime.run(["sh", "-c", command], {})
142
+ if result.exit_code:
143
+ detail = (result.stderr or result.stdout).strip()[-500:]
144
+ raise RuntimeError(f"failed to {action}: {detail}")
@@ -4,6 +4,7 @@ from verifiers.v1.envs.agentic_judge.env import (
4
4
  Criterion,
5
5
  JudgeTaskConfig,
6
6
  ScoreConfig,
7
+ TextFile,
7
8
  )
8
9
 
9
10
  __all__ = [
@@ -12,4 +13,5 @@ __all__ = [
12
13
  "Criterion",
13
14
  "JudgeTaskConfig",
14
15
  "ScoreConfig",
16
+ "TextFile",
15
17
  ]
@@ -1,14 +1,16 @@
1
- """agentic-judge: a solver plays the task, a judge verifies it in the same box.
1
+ """agentic-judge: a solver plays the task, then a judge verifies the work.
2
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
3
+ A reusable env (`--env.id agentic-judge` over any taskset). The solver plays the
4
+ task in a container provisioned from its runtime policy; the judge then grades
7
5
  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).
6
+ verdicts to `/tmp/verdict.json`, with the solver's full trace record uploaded at
7
+ `/tmp/trace.json`. `finalize()` validates them strictly onto the solver's trace —
8
+ `judge/<name>` metrics plus a weighted-mean `judge` reward, composed with the
9
+ taskset's own rewards via `[env.score]` (judge-only by default).
10
+
11
+ `--env.share-runtime` controls whether the judge uses the solver's runtime. It is
12
+ enabled by default. When disabled, the judge gets a fresh runtime containing the
13
+ task's collected artifacts.
12
14
  """
13
15
 
14
16
  import json
@@ -21,6 +23,7 @@ from pydantic import Field, field_validator
21
23
 
22
24
  import verifiers.v1 as vf
23
25
  from verifiers.v1.types import StrictBaseModel
26
+ from verifiers.v1.utils.compile import validate_pairing
24
27
 
25
28
  VERDICT_FILE = "/tmp/verdict.json"
26
29
  TRACE_FILE = "/tmp/trace.json"
@@ -97,19 +100,31 @@ def _render(template: str, **fields: str) -> str:
97
100
  return pattern.sub(lambda m: fields[m.group(1)], template)
98
101
 
99
102
 
100
- SANDBOX_NOTE = f"""\
103
+ _RECORD_NOTE = f"""\
104
+ The agent's raw trace record (JSON: messages, tool calls, and its `info`
105
+ artifacts) is written by the harness — not the agent — at `{TRACE_FILE}`. The
106
+ record can be very large — never dump it whole; peek selectively (list its
107
+ keys, then slice out specific fields with python or jq) and pull only what you
108
+ need. It is complete — it may also carry the task's own scores/metrics and
109
+ reference material (a gold answer, a reference solution, held-out tests). Those
110
+ are context, not your standard: recorded scores can be wrong and references can
111
+ be narrower than the task; do not over-index on how a reference solves it. Your
112
+ verdict is what YOU verified by execution."""
113
+
114
+ SHARED_WORKSPACE_NOTE = f"""\
115
+ ## Your workspace
116
+
117
+ The graded agent worked in this sandbox. Its edits and any scoring side effects
118
+ are present. {_RECORD_NOTE}"""
119
+
120
+ ISOLATED_WORKSPACE_NOTE = f"""\
101
121
  ## Your workspace
102
122
 
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."""
123
+ This is a fresh sandbox built from the task's image. The task's published
124
+ artifacts were restored at their original paths; other changes made by the
125
+ graded agent are not present. The usual artifact location is
126
+ `{vf.ARTIFACTS_DIR}/` (for code tasks, typically a patch to read or apply), plus
127
+ any task-declared paths. {_RECORD_NOTE}"""
113
128
 
114
129
  HINT_SECTION = """\
115
130
  ## Hints
@@ -125,13 +140,30 @@ class JudgeTask(vf.Task):
125
140
 
126
141
  NEEDS_CONTAINER = True
127
142
 
128
- def __init__(self, data: vf.TaskData, files: dict[str, bytes]) -> None:
143
+ def __init__(
144
+ self,
145
+ data: vf.TaskData,
146
+ files: dict[str, bytes],
147
+ artifacts: dict[str, bytes],
148
+ ) -> None:
129
149
  super().__init__(data)
130
150
  self.files = files
151
+ self.artifacts = artifacts
131
152
 
132
153
  @classmethod
133
- def from_trace(cls, solution: vf.Trace, config: "JudgeTaskConfig") -> "JudgeTask":
134
- """Mint the judge's task from the solver's finished trace."""
154
+ def from_trace(
155
+ cls,
156
+ solution: vf.Trace,
157
+ config: "JudgeTaskConfig",
158
+ share_runtime: bool = True,
159
+ ) -> "JudgeTask":
160
+ """Mint the judge's task from the solver's finished trace.
161
+
162
+ `share_runtime` selects both the workspace note and artifact transport. In
163
+ the solver's box the published artifacts are already on disk, so none
164
+ travel; a fresh box gets the collected set, restored by `setup` at the
165
+ paths they had.
166
+ """
135
167
  solved = solution.task.data
136
168
  files = {TRACE_FILE: json.dumps(solution.to_record()).encode()}
137
169
  template = config.build_prompt()
@@ -139,7 +171,10 @@ class JudgeTask(vf.Task):
139
171
  if "{prompt}" not in template:
140
172
  # A policy that doesn't place the task statement itself still needs it.
141
173
  body += "\n\n" + _render(TASK_SECTION, prompt=solved.prompt_text)
142
- sections = [body, _verdict_section(config.criteria()), SANDBOX_NOTE]
174
+ workspace_note = (
175
+ SHARED_WORKSPACE_NOTE if share_runtime else ISOLATED_WORKSPACE_NOTE
176
+ )
177
+ sections = [body, _verdict_section(config.criteria()), workspace_note]
143
178
  if (hint := config.build_hint()) is not None:
144
179
  sections.insert(1, _render(HINT_SECTION, hint=hint))
145
180
  prompt = "\n\n".join(sections)
@@ -152,9 +187,11 @@ class JudgeTask(vf.Task):
152
187
  resources=solved.resources,
153
188
  ),
154
189
  files=files,
190
+ artifacts={} if share_runtime else solution.state.artifacts,
155
191
  )
156
192
 
157
193
  async def setup(self, trace: vf.Trace, runtime: vf.Runtime) -> None:
194
+ await vf.restore(runtime, self.artifacts)
158
195
  # The solver had this box first: a pre-seeded verdict must never read as
159
196
  # the judge's own, and a file (or planted symlink) at an upload path must
160
197
  # never survive it — a symlinked TRACE_FILE would redirect the write onto
@@ -177,34 +214,53 @@ class JudgeTask(vf.Task):
177
214
  trace.info["verdict"] = json.loads(raw)
178
215
 
179
216
 
217
+ class TextFile(vf.BaseConfig):
218
+ """An explicit file-backed text value for config formats without `Path` values."""
219
+
220
+ path: Path
221
+
222
+
223
+ TextSource = str | Path | TextFile
224
+
225
+
180
226
  class JudgeTaskConfig(vf.BaseConfig):
181
227
  """The judge's minted task: the grading policy and what lands in its box."""
182
228
 
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`."""
229
+ prompt: TextSource | None = None
230
+ """Grading policy: a string is inline text; a `Path` in Python or
231
+ `{ path = "policy.md" }` in config reads a file. Replaces only the policy
232
+ body the verdict contract and workspace note are always appended. May
233
+ reference `{prompt}` (the solver task's prompt); if it doesn't, the task
234
+ statement is appended after."""
235
+ hint: TextSource | None = None
236
+ """Optional hints, with the same explicit inline/file forms as `prompt`,
237
+ injected as their own section: task-family pointers into the trace or box —
238
+ e.g. for math, where the reference answer lives in the record; for SWE, to
239
+ diff the repo or read `info.patch`."""
191
240
  rubric: Path | None = None
192
241
  """Criteria the judge grades against: a `.toml`/`.json` file with a
193
242
  `criteria` list — the plugged rubric judge's format, so the same rubric
194
243
  files work for both. None grades the single built-in `solved` criterion."""
195
244
 
245
+ @staticmethod
246
+ def _resolve(value: TextSource) -> str:
247
+ if isinstance(value, str):
248
+ return value
249
+ path = value if isinstance(value, Path) else value.path
250
+ return path.read_text(encoding="utf-8")
251
+
196
252
  def build_prompt(self) -> str:
197
253
  if self.prompt is None:
198
254
  return GRADE_PROMPT + "\n\n" + TASK_SECTION
199
- return self.prompt.read_text()
255
+ return self._resolve(self.prompt)
200
256
 
201
257
  def build_hint(self) -> str | None:
202
- return self.hint.read_text() if self.hint is not None else None
258
+ return self._resolve(self.hint) if self.hint is not None else None
203
259
 
204
260
  def criteria(self) -> list[Criterion]:
205
261
  if self.rubric is None:
206
262
  return [SOLVED]
207
- text = self.rubric.read_text()
263
+ text = self.rubric.read_text(encoding="utf-8")
208
264
  data = (
209
265
  tomllib.loads(text)
210
266
  if self.rubric.suffix.lower() == ".toml"
@@ -241,23 +297,23 @@ class ScoreConfig(vf.BaseConfig):
241
297
 
242
298
  class AgenticJudgeEnvConfig(vf.EnvConfig):
243
299
  solver: vf.AgentConfig = vf.AgentConfig()
244
- """The solver agent. It owns the shared box, so its runtime must be a
245
- container: `--env.solver.runtime.type docker|prime`."""
300
+ """The solver agent. Its runtime must be a container:
301
+ `--env.solver.runtime.type docker|prime`."""
246
302
  judge: vf.AgentConfig = vf.AgentConfig()
247
- """The judge agent. It plays in the solver's box; its own runtime policy is
248
- ignored (overwritten with the solver's)."""
303
+ """The judge agent. Its runtime is ignored when `share_runtime` is enabled;
304
+ otherwise it must be a container."""
305
+ share_runtime: bool = True
306
+ """Whether the judge grades in the solver's runtime."""
249
307
  task: JudgeTaskConfig = JudgeTaskConfig()
250
308
  score: ScoreConfig = ScoreConfig()
251
309
 
252
310
 
253
311
  class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
254
312
  def __init__(self, config: AgenticJudgeEnvConfig) -> None:
255
- # The judge plays in the solver's box, so its effective runtime IS the
256
- # solver's policy — aligning the config keeps the base env's subprocess
257
- # warning and the runtime stamped on the judge's trace truthful.
258
- config.judge = config.judge.model_copy(
259
- update={"runtime": config.solver.runtime}
260
- )
313
+ if config.share_runtime:
314
+ config.judge = config.judge.model_copy(
315
+ update={"runtime": config.solver.runtime}
316
+ )
261
317
  super().__init__(config)
262
318
  self._check_agents()
263
319
  # A missing policy file or a malformed rubric fails here, not mid-episode.
@@ -271,30 +327,42 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
271
327
  judge = self._harnesses["judge"]
272
328
  if not judge.EXECUTES_CODE:
273
329
  raise ValueError(
274
- "agentic-judge plays a code-executing judge in its own sandbox, but "
330
+ "agentic-judge requires a judge harness that can execute code, but "
275
331
  f"harness {judge.config.id!r} is a tool-less chat loop — a verdict "
276
332
  "that needs no execution is a plugged judge "
277
333
  "(--env.taskset.task.judges), not an agent."
278
334
  )
279
335
  if isinstance(self.config.solver.runtime, vf.SubprocessConfig):
280
336
  raise TypeError(
281
- "agentic-judge plays its judge in the solver's box, but the solver "
282
- "(which provisions it) resolves to the subprocess runtime; use "
337
+ "agentic-judge requires the solver to run in a container, but it "
338
+ "resolves to the subprocess runtime; use "
283
339
  "--env.solver.runtime.type docker or prime"
284
340
  )
341
+ validate_pairing(judge, JudgeTask, self.config.judge.runtime)
285
342
 
286
343
  async def setup(self, agents: vf.Agents) -> None:
287
344
  # The judge grades the policy; its tokens are never training data.
288
345
  agents.judge.trainable = False
289
346
 
290
347
  async def run(self, task: vf.Task, agents: vf.Agents) -> None:
291
- async with agents.solver.provision(task) as box:
292
- solution = await agents.solver.run(task, runtime=box)
293
- judge_task = JudgeTask.from_trace(solution, self.config.task)
294
- await agents.judge.run(judge_task, runtime=box)
348
+ if self.config.share_runtime:
349
+ async with agents.solver.provision(task) as box:
350
+ solution = await agents.solver.run(task, runtime=box)
351
+ judge_task = JudgeTask.from_trace(solution, self.config.task)
352
+ await agents.judge.run(judge_task, runtime=box)
353
+ return
354
+
355
+ solution = await agents.solver.run(task)
356
+ if not solution.ok:
357
+ return
358
+ await agents.judge.run(
359
+ JudgeTask.from_trace(solution, self.config.task, share_runtime=False)
360
+ )
295
361
 
296
362
  async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
297
363
  by_agent = {t.agent.name: t for t in episode.traces}
364
+ if "judge" not in by_agent:
365
+ return
298
366
  solution, verdict = by_agent["solver"], by_agent["judge"]
299
367
  data = verdict.info.get("verdict")
300
368
  if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
@@ -1,10 +1,10 @@
1
1
  """Mutable state shared within one rollout.
2
2
 
3
3
  Tool servers synchronize it through the interception state channel. It is excluded
4
- from serialized traces; persist artifacts in `Trace.info` instead.
4
+ from serialized traces.
5
5
  """
6
6
 
7
- from pydantic import ConfigDict
7
+ from pydantic import ConfigDict, Field
8
8
  from typing_extensions import TypeVar
9
9
 
10
10
  from verifiers.v1.types import StrictBaseModel
@@ -13,6 +13,7 @@ from verifiers.v1.utils.generic import concrete_type
13
13
 
14
14
  class State(StrictBaseModel):
15
15
  model_config = ConfigDict(ser_json_inf_nan="constants")
16
+ artifacts: dict[str, bytes] = Field(default_factory=dict)
16
17
 
17
18
 
18
19
  StateT = TypeVar("StateT", bound=State, default=State)
@@ -34,6 +34,7 @@ from pydantic import ConfigDict, Field
34
34
  from pydantic_config import BaseConfig
35
35
  from typing_extensions import TypeVar
36
36
 
37
+ from verifiers.v1.artifacts import Artifact
37
38
  from verifiers.v1.configs.task import TaskConfig
38
39
  from verifiers.v1.decorators import discover_decorated, invoke_all
39
40
  from verifiers.v1.errors import TaskError, boundary
@@ -102,6 +103,11 @@ class TaskData(StrictBaseModel):
102
103
  """Execution-time destinations denied by this task and combined with runtime
103
104
  blocks. Non-empty concrete allowlists cannot be combined with blocklists. Docker
104
105
  framework routes take precedence; ordinary Prime deny rules pass through unchanged."""
106
+ artifacts: list[Artifact] = Field(default_factory=list)
107
+ """Paths collected from one runtime and restored at the same locations in another,
108
+ on top of the implicitly collected `/logs/artifacts/` convention dir. Declare
109
+ runtime outputs that must cross that boundary. A declared path that is missing at
110
+ collection time fails the rollout."""
105
111
  timeout: TaskTimeout = TaskTimeout()
106
112
  resources: TaskResources = TaskResources()
107
113