verifiers 0.2.2.dev78__tar.gz → 0.2.2.dev80__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 (428) hide show
  1. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_judges.py +24 -4
  3. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/output.py +6 -2
  4. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/judge.py +2 -2
  5. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/agentic_judge/env.py +13 -82
  6. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/rlm/harness.py +5 -13
  7. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/server.py +3 -3
  8. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judges/rubric.py +76 -62
  9. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/legacy.py +13 -13
  10. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/session.py +8 -0
  11. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/.gitignore +0 -0
  12. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/LICENSE +0 -0
  13. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/README.md +0 -0
  14. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/pyproject.toml +0 -0
  15. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/__init__.py +0 -0
  16. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/conftest.py +0 -0
  17. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_browser_env.py +0 -0
  18. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_build_script.py +0 -0
  19. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_cli_agent_env.py +0 -0
  20. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_client_auth_errors.py +0 -0
  21. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_client_config.py +0 -0
  22. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_client_multimodal_types.py +0 -0
  23. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_composable_env.py +0 -0
  24. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_context_token_metrics.py +0 -0
  25. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_decorator_ranks.py +0 -0
  26. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_endpoint_registry.py +0 -0
  27. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_env_group.py +0 -0
  28. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_env_server.py +0 -0
  29. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_environment.py +0 -0
  30. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_environment_extra.py +0 -0
  31. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_error_chain.py +0 -0
  32. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_eval_display.py +0 -0
  33. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_eval_utils.py +0 -0
  34. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_gepa_cli.py +0 -0
  35. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_gepa_utils.py +0 -0
  36. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_gym_env.py +0 -0
  37. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_harbor_env_mcp.py +0 -0
  38. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_imports.py +0 -0
  39. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_init_script.py +0 -0
  40. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_install_utils.py +0 -0
  41. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_interception_utils.py +0 -0
  42. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_logging.py +0 -0
  43. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_parser.py +0 -0
  54. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_rubric.py +0 -0
  62. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_types.py +0 -0
  76. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/test_xml_parser.py +0 -0
  77. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/conftest.py +0 -0
  78. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  79. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/duet_v1.py +0 -0
  80. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  81. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  82. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  83. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  84. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  85. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_v0.py +0 -0
  86. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/echo_v1.py +0 -0
  87. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/pyproject.toml +0 -0
  88. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  89. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_color_codeword_tasks.py +0 -0
  90. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_configs.py +0 -0
  91. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_e2e.py +0 -0
  92. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_envs.py +0 -0
  93. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_graph.py +0 -0
  94. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_legacy.py +0 -0
  95. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_scoring.py +0 -0
  96. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_taskset.py +0 -0
  97. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/tests/v1/test_trace.py +0 -0
  98. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/__init__.py +0 -0
  99. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/__init__.py +0 -0
  100. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/__init__.py +0 -0
  101. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/build.py +0 -0
  102. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/eval.py +0 -0
  103. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/gepa.py +0 -0
  104. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/init.py +0 -0
  105. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/install.py +0 -0
  106. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/commands/setup.py +0 -0
  107. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/plugins/__init__.py +0 -0
  108. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/plugins/prime.py +0 -0
  109. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/cli/tui.py +0 -0
  110. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/__init__.py +0 -0
  111. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/anthropic_messages_client.py +0 -0
  112. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/client.py +0 -0
  113. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  114. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/openai_chat_completions_client.py +0 -0
  115. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  116. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/openai_completions_client.py +0 -0
  117. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/openai_responses_client.py +0 -0
  118. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/clients/renderer_client.py +0 -0
  119. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/decorators.py +0 -0
  120. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/__init__.py +0 -0
  121. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/env_group.py +0 -0
  122. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/environment.py +0 -0
  123. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/README.md +0 -0
  124. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/__init__.py +0 -0
  125. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  126. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/README.md +0 -0
  127. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/__init__.py +0 -0
  128. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/_filter.py +0 -0
  129. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  130. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harness.py +0 -0
  131. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  132. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  133. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  134. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  135. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  136. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  137. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  138. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/task.py +0 -0
  139. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  140. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  141. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  142. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  143. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  144. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  145. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  146. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  147. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  150. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  151. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  152. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  153. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  154. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  155. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  156. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  157. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  158. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  159. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  160. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  161. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  162. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  163. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  164. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  165. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  166. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  167. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  168. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  169. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  170. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  171. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  172. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  173. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/gym_env.py +0 -0
  174. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  175. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  176. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  177. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/mcp_env.py +0 -0
  178. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/opencode_env.py +0 -0
  179. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  180. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  181. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  182. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/utils/__init__.py +0 -0
  183. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  184. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  185. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/README.md +0 -0
  186. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/__init__.py +0 -0
  187. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/README.md +0 -0
  188. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  189. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  190. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  191. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  192. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  193. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  194. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/openenv_env.py +0 -0
  195. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  196. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/integrations/textarena_env.py +0 -0
  197. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/multiturn_env.py +0 -0
  198. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/python_env.py +0 -0
  199. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/sandbox_env.py +0 -0
  200. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/singleturn_env.py +0 -0
  201. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/stateful_tool_env.py +0 -0
  202. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/envs/tool_env.py +0 -0
  203. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/errors.py +0 -0
  204. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/gepa/__init__.py +0 -0
  205. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/gepa/adapter.py +0 -0
  206. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/gepa/config.py +0 -0
  207. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/gepa/display.py +0 -0
  208. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/gepa/gepa_utils.py +0 -0
  209. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/parsers/__init__.py +0 -0
  210. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/parsers/maybe_think_parser.py +0 -0
  211. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/parsers/parser.py +0 -0
  212. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/parsers/think_parser.py +0 -0
  213. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/parsers/xml_parser.py +0 -0
  214. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/__init__.py +0 -0
  215. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  216. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/judge_rubric.py +0 -0
  217. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/math_rubric.py +0 -0
  218. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/rubric.py +0 -0
  219. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/rubrics/rubric_group.py +0 -0
  220. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/__init__.py +0 -0
  221. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/build.py +0 -0
  222. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/eval.py +0 -0
  223. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/gepa.py +0 -0
  224. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/init.py +0 -0
  225. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/install.py +0 -0
  226. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/setup.py +0 -0
  227. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/scripts/tui.py +0 -0
  228. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/__init__.py +0 -0
  229. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/client/env_client.py +0 -0
  230. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/client/zmq_env_client.py +0 -0
  231. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/server/__init__.py +0 -0
  232. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/server/env_router.py +0 -0
  233. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/server/env_server.py +0 -0
  234. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/server/env_worker.py +0 -0
  235. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/server/zmq_env_server.py +0 -0
  236. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/serve/types.py +0 -0
  237. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/types.py +0 -0
  238. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/__init__.py +0 -0
  239. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/async_utils.py +0 -0
  240. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/client_utils.py +0 -0
  241. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/config_utils.py +0 -0
  242. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/data_utils.py +0 -0
  243. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/display_utils.py +0 -0
  244. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/env_config_utils.py +0 -0
  245. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/env_utils.py +0 -0
  246. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/error_utils.py +0 -0
  247. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/eval_display.py +0 -0
  248. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/eval_utils.py +0 -0
  249. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/heartbeat.py +0 -0
  250. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/import_utils.py +0 -0
  251. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/install_utils.py +0 -0
  252. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/interception_utils.py +0 -0
  253. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/logging_utils.py +0 -0
  254. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/message_utils.py +0 -0
  255. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/metric_utils.py +0 -0
  256. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/path_utils.py +0 -0
  257. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/pricing_utils.py +0 -0
  258. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/process_utils.py +0 -0
  259. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/response_utils.py +0 -0
  260. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/save_utils.py +0 -0
  261. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/serve_utils.py +0 -0
  262. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/thread_utils.py +0 -0
  263. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/threaded_sandbox_client.py +0 -0
  264. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/tool_utils.py +0 -0
  265. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/usage_utils.py +0 -0
  266. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/utils/version_utils.py +0 -0
  267. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/__init__.py +0 -0
  268. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/acp/__init__.py +0 -0
  269. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/acp/_runner.py +0 -0
  270. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/agent.py +0 -0
  271. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/__init__.py +0 -0
  272. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  273. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/dashboard/base.py +0 -0
  274. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/dashboard/eval.py +0 -0
  275. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/dashboard/replay.py +0 -0
  276. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/dashboard/validate.py +0 -0
  277. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/debug.py +0 -0
  278. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/eval/__init__.py +0 -0
  279. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/eval/main.py +0 -0
  280. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/eval/resume.py +0 -0
  281. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/eval/runner.py +0 -0
  282. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/gepa.py +0 -0
  283. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/init.py +0 -0
  284. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/replay.py +0 -0
  285. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/resolve.py +0 -0
  286. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/cli/validate.py +0 -0
  287. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/clients/__init__.py +0 -0
  288. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/clients/base.py +0 -0
  289. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/clients/client.py +0 -0
  290. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/clients/eval.py +0 -0
  291. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/clients/train.py +0 -0
  292. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/__init__.py +0 -0
  293. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/agent.py +0 -0
  294. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/__init__.py +0 -0
  295. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/debug.py +0 -0
  296. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/env.py +0 -0
  297. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/eval.py +0 -0
  298. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/init.py +0 -0
  299. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/replay.py +0 -0
  300. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/cli/validate.py +0 -0
  301. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/client.py +0 -0
  302. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/env.py +0 -0
  303. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/harness.py +0 -0
  304. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/legacy.py +0 -0
  305. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/retries.py +0 -0
  306. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/serve.py +0 -0
  307. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/task.py +0 -0
  308. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/configs/taskset.py +0 -0
  309. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/dialects/__init__.py +0 -0
  310. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/dialects/anthropic.py +0 -0
  311. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/dialects/base.py +0 -0
  312. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/dialects/chat.py +0 -0
  313. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/dialects/responses.py +0 -0
  314. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/env.py +0 -0
  315. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/__init__.py +0 -0
  316. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  317. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  318. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/best_of_n/env.py +0 -0
  319. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  320. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/single_agent/env.py +0 -0
  321. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  322. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/envs/user_sim/env.py +0 -0
  323. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/episode.py +0 -0
  324. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/errors.py +0 -0
  325. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/__init__.py +0 -0
  326. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/adapter.py +0 -0
  327. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/config.py +0 -0
  328. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/dataset.py +0 -0
  329. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/reflection.py +0 -0
  330. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/gepa/runner.py +0 -0
  331. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/graph.py +0 -0
  332. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harness.py +0 -0
  333. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/__init__.py +0 -0
  334. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  335. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/bash/harness.py +0 -0
  336. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/bash/program.py +0 -0
  337. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  338. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  339. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  340. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  341. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  342. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  343. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/codex/harness.py +0 -0
  344. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  345. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  346. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  347. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  348. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  349. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  350. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  351. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  352. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/null/__init__.py +0 -0
  353. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/null/harness.py +0 -0
  354. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/null/program.py +0 -0
  355. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  356. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  357. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  358. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/pi/harness.py +0 -0
  359. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  360. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/pool/harness.py +0 -0
  361. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  362. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  363. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  364. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  365. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/__init__.py +0 -0
  366. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/base.py +0 -0
  367. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/pool.py +0 -0
  368. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  369. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/tunnel/base.py +0 -0
  370. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/tunnel/custom.py +0 -0
  371. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/interception/tunnel/prime.py +0 -0
  372. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judge.py +0 -0
  373. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judges/__init__.py +0 -0
  374. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judges/reference.py +0 -0
  375. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judges/reference.txt +0 -0
  376. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/judges/rubric.txt +0 -0
  377. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/mcp/__init__.py +0 -0
  378. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/mcp/launch.py +0 -0
  379. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/mcp/server.py +0 -0
  380. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/mcp/toolset.py +0 -0
  381. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/rollout.py +0 -0
  382. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/__init__.py +0 -0
  383. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/base.py +0 -0
  384. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  385. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/docker/egress.py +0 -0
  386. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/limiters.py +0 -0
  387. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/modal.py +0 -0
  388. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/prime.py +0 -0
  389. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/runtimes/subprocess.py +0 -0
  390. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/serve/__init__.py +0 -0
  391. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/serve/client.py +0 -0
  392. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/serve/pool.py +0 -0
  393. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/serve/server.py +0 -0
  394. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/serve/types.py +0 -0
  395. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/state.py +0 -0
  396. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/task.py +0 -0
  397. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/taskset.py +0 -0
  398. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/__init__.py +0 -0
  399. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  400. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/harbor/env.py +0 -0
  401. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  402. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  403. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  404. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  405. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  406. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  407. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  408. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  409. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/trace.py +0 -0
  410. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/types.py +0 -0
  411. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/__init__.py +0 -0
  412. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/aio.py +0 -0
  413. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/artifacts.py +0 -0
  414. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/compile.py +0 -0
  415. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/decorators.py +0 -0
  416. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/format.py +0 -0
  417. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/generic.py +0 -0
  418. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/git.py +0 -0
  419. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/image.py +0 -0
  420. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/install.py +0 -0
  421. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/interrupt.py +0 -0
  422. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/loaders.py +0 -0
  423. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/logging.py +0 -0
  424. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/memory.py +0 -0
  425. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/platform.py +0 -0
  426. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/retries.py +0 -0
  427. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/verifiers/v1/utils/score.py +0 -0
  428. {verifiers-0.2.2.dev78 → verifiers-0.2.2.dev80}/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.dev78
3
+ Version: 0.2.2.dev80
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
@@ -9,6 +9,7 @@ import pytest
9
9
  from pydantic import Field
10
10
 
11
11
  import verifiers.v1 as vf
12
+ from verifiers.v1.envs.agentic_judge import ScoreConfig
12
13
  from verifiers.v1.graph import MessageNode
13
14
  from verifiers.v1.judge import Judge, JudgeResponse
14
15
  from verifiers.v1.types import AssistantMessage, UserMessage
@@ -480,10 +481,14 @@ def test_rubric_criteria_toml_and_json(tmp_path):
480
481
  toml = rubric_judge(tmp_path).criteria
481
482
  assert [c.name for c in toml] == ["mentions_paris", "is_polite"]
482
483
  assert [c.weight for c in toml] == [3.0, 1.0]
483
- # JSON: both the {"criteria": [...]} object and a bare list parse to the same rubric
484
+ # JSON accepts a metadata-bearing object or a bare criteria list.
484
485
  items = [c.model_dump() for c in toml]
485
486
  assert (
486
- rubric_judge(tmp_path, json.dumps({"criteria": items}), ".json").criteria
487
+ rubric_judge(
488
+ tmp_path,
489
+ json.dumps({"title": "Safety", "criteria": items}),
490
+ ".json",
491
+ ).criteria
487
492
  == toml
488
493
  )
489
494
  assert rubric_judge(tmp_path, json.dumps(items), ".json").criteria == toml
@@ -511,8 +516,23 @@ def test_rubric_rejects_bad_files(tmp_path):
511
516
  ).criteria
512
517
  # negative/NaN/inf weights would invert a criterion or corrupt the weighted mean
513
518
  for weight in (-1.0, float("nan"), float("inf")):
514
- with pytest.raises(ValueError, match="negative or non-finite"):
519
+ with pytest.raises(
520
+ ValueError, match="greater than or equal to 0|finite number"
521
+ ):
515
522
  _ = rubric_judge(tmp_path, weights={"mentions_paris": weight}).criteria
523
+ with pytest.raises(ValueError, match="non-finite total"):
524
+ _ = rubric_judge(
525
+ tmp_path, weights={"mentions_paris": 1e308, "is_polite": 1e308}
526
+ ).criteria
527
+
528
+
529
+ @pytest.mark.parametrize("weight", [float("nan"), float("inf"), float("-inf")])
530
+ def test_judge_composition_weights_are_finite(weight):
531
+ with pytest.raises(ValueError, match="finite number"):
532
+ vf.JudgeConfig(weight=weight)
533
+ for field in ("task_weight", "judge_weight"):
534
+ with pytest.raises(ValueError, match="finite number"):
535
+ ScoreConfig.model_validate({field: weight})
516
536
 
517
537
 
518
538
  async def test_rubric_score(tmp_path, fake_judge_model):
@@ -569,7 +589,7 @@ async def test_rubric_off_menu_answer_raises(tmp_path, monkeypatch):
569
589
 
570
590
 
571
591
  def test_rubric_choices_validation(tmp_path):
572
- with pytest.raises(ValueError, match="at least two"):
592
+ with pytest.raises(ValueError, match="at least 2"):
573
593
  _ = rubric_judge(
574
594
  tmp_path, body='[[criteria]]\nname = "x"\ntext = "t"\nchoices = ["only"]\n'
575
595
  ).criteria
@@ -12,6 +12,7 @@ before the episode atom (one bare trace per line) are still readable:
12
12
 
13
13
  import asyncio
14
14
  import json
15
+ from functools import cache
15
16
  from pathlib import Path
16
17
 
17
18
  import tomli_w
@@ -29,6 +30,9 @@ TRACES_FILE = "traces.jsonl"
29
30
  CONFIG_FILE = "config.toml"
30
31
  """Filename a run's resolved config is written to (re-runnable via `@ config.toml`)."""
31
32
 
33
+ # Compiling an adapter is the expensive part; run output reuses only a few model classes.
34
+ type_adapter = cache(TypeAdapter)
35
+
32
36
 
33
37
  def output_path(config: EvalConfig) -> Path:
34
38
  """Where this run writes: `outputs/<env>--<model>--<harness>/<uuid>` (or the explicit
@@ -72,7 +76,7 @@ def save_config(config: BaseModel, results_dir: Path) -> None:
72
76
  def write_episode(results_dir: Path, episode: Episode) -> None:
73
77
  """Serialize and append one rollout episode in the worker thread."""
74
78
  # Preserve fields declared by typed Trace subclasses nested in the episode.
75
- data = TypeAdapter(type(episode)).dump_json(episode, exclude_none=True)
79
+ data = type_adapter(type(episode)).dump_json(episode, exclude_none=True)
76
80
  with (results_dir / TRACES_FILE).open("ab") as f:
77
81
  f.write(data + b"\n")
78
82
 
@@ -88,7 +92,7 @@ def read_episodes(results_dir: Path, trace_type: type) -> list[Episode]:
88
92
  `trace_type` (`Trace[WireTaskData, ...]` reads any taskset's file without
89
93
  importing it). A pre-episode line (one bare trace) is wrapped as a single-trace
90
94
  record, so both file generations read uniformly."""
91
- trace_adapter = TypeAdapter(trace_type)
95
+ trace_adapter = type_adapter(trace_type)
92
96
  episodes: list[Episode] = []
93
97
  with (results_dir / TRACES_FILE).open(encoding="utf-8") as f:
94
98
  for line in f:
@@ -5,7 +5,7 @@ from collections.abc import Sequence
5
5
  from pathlib import Path
6
6
  from typing import Any
7
7
 
8
- from pydantic import BaseModel, SerializeAsAny
8
+ from pydantic import BaseModel, FiniteFloat, SerializeAsAny
9
9
 
10
10
  from verifiers.v1.clients import BaseClientConfig
11
11
  from verifiers.v1.types import ID, SamplingConfig
@@ -17,7 +17,7 @@ class JudgeConfig(BaseClientConfig):
17
17
  """Plugin id; empty for a judge called directly by task code."""
18
18
  name: str = ""
19
19
  """Reward key override for a plugged judge."""
20
- weight: float = 1.0
20
+ weight: FiniteFloat = 1.0
21
21
  model: str = "openai/gpt-5.4-nano"
22
22
  sampling: SamplingConfig = SamplingConfig()
23
23
  prompt: Path | None = None
@@ -14,14 +14,18 @@ task's collected artifacts.
14
14
  """
15
15
 
16
16
  import json
17
- import math
18
17
  import re
19
- import tomllib
20
18
  from pathlib import Path
21
19
 
22
- from pydantic import BaseModel, Field, field_validator
20
+ from pydantic import FiniteFloat
23
21
 
24
22
  import verifiers.v1 as vf
23
+ from verifiers.v1.judges.rubric import (
24
+ Criterion,
25
+ RubricVerdicts,
26
+ load_criteria,
27
+ score_verdicts,
28
+ )
25
29
  from verifiers.v1.utils.compile import validate_pairing
26
30
 
27
31
  VERDICT_FILE = "/tmp/verdict.json"
@@ -38,29 +42,6 @@ TASK_SECTION = """\
38
42
  {prompt}"""
39
43
 
40
44
 
41
- class Criterion(BaseModel):
42
- """One rubric criterion — the plugged rubric judge's format, mirrored so the
43
- same `criteria` files grade both judges."""
44
-
45
- name: str
46
- """Key for the criterion's metric (`judge/<name>`)."""
47
- text: str
48
- weight: float = 1.0
49
- """The criterion's share of the reward."""
50
- choices: list[str] = Field(default_factory=lambda: ["no", "yes"])
51
- """Allowed answers, ordered **worst → best**: the first scores 0.0, the last 1.0, the rest
52
- evenly spaced by rank. Default `["no", "yes"]` is a binary check. Needs >= 2, no duplicates."""
53
-
54
- @field_validator("choices")
55
- @classmethod
56
- def _check_choices(cls, v: list[str]) -> list[str]:
57
- if len(v) < 2:
58
- raise ValueError(f"`choices` needs at least two options, got {v}")
59
- if len(set(v)) != len(v):
60
- raise ValueError(f"`choices` has duplicate options: {v}")
61
- return v
62
-
63
-
64
45
  SOLVED = Criterion(
65
46
  name="solved",
66
47
  text="The task is fully solved: what the task asked for is achieved, and "
@@ -210,7 +191,7 @@ class JudgeTask(vf.Task):
210
191
  f"the judge wrote no verdict to {VERDICT_FILE}; its final act must "
211
192
  'be writing {"verdicts": [{"name", "reason", "verdict"}, ...]} there'
212
193
  ) from e
213
- trace.info["verdict"] = json.loads(raw)
194
+ trace.info["verdict"] = RubricVerdicts.model_validate_json(raw).model_dump()
214
195
 
215
196
 
216
197
  class TextFile(vf.BaseConfig):
@@ -259,38 +240,16 @@ class JudgeTaskConfig(vf.BaseConfig):
259
240
  def criteria(self) -> list[Criterion]:
260
241
  if self.rubric is None:
261
242
  return [SOLVED]
262
- text = self.rubric.read_text(encoding="utf-8")
263
- data = (
264
- tomllib.loads(text)
265
- if self.rubric.suffix.lower() == ".toml"
266
- else json.loads(text)
267
- )
268
- items = data.get("criteria", []) if isinstance(data, dict) else data
269
- criteria = [Criterion.model_validate(item) for item in items]
270
- if not criteria:
271
- raise ValueError(f"rubric file '{self.rubric}' lists no criteria")
272
- names = [criterion.name for criterion in criteria]
273
- if len(set(names)) != len(names):
274
- raise ValueError(
275
- f"rubric file '{self.rubric}' has duplicate criterion names"
276
- )
277
- if bad := [c.name for c in criteria if not 0 <= c.weight < math.inf]:
278
- raise ValueError(
279
- f"rubric '{self.rubric}' has negative or non-finite criterion "
280
- f"weights: {bad}"
281
- )
282
- if sum(criterion.weight for criterion in criteria) <= 0:
283
- raise ValueError(f"rubric '{self.rubric}' has no positive criterion weight")
284
- return criteria
243
+ return load_criteria(self.rubric)
285
244
 
286
245
 
287
246
  class ScoreConfig(vf.BaseConfig):
288
247
  """How the judge's verdict composes with the taskset's own rewards on the
289
248
  solver's trace. Judge-only by default."""
290
249
 
291
- task_weight: float = 0.0
250
+ task_weight: FiniteFloat = 0.0
292
251
  """Scale applied to the taskset's own rewards; 1 keeps them next to the verdict."""
293
- judge_weight: float = 1.0
252
+ judge_weight: FiniteFloat = 1.0
294
253
  """Weight of the judge's verdict in the solver's reward."""
295
254
 
296
255
 
@@ -363,37 +322,9 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
363
322
  if "judge" not in by_agent:
364
323
  return
365
324
  solution, verdict = by_agent["solver"], by_agent["judge"]
366
- data = verdict.info.get("verdict")
367
- if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
368
- raise TypeError(
369
- f"no verdicts on the judge's trace (expected {VERDICT_FILE} with a "
370
- '"verdicts" list)'
371
- )
325
+ verdicts = RubricVerdicts.model_validate(verdict.info.get("verdict")).verdicts
372
326
  criteria = self.config.task.criteria()
373
- by_criterion = {c.name: c for c in criteria}
374
- answers: dict[str, str] = {}
375
- for entry in data["verdicts"]:
376
- if not isinstance(entry, dict):
377
- raise TypeError(f"verdict entry {entry!r} is not an object")
378
- name = str(entry.get("name"))
379
- if name in answers:
380
- # Contradictory duplicates must not collapse to whichever came last.
381
- raise ValueError(f"judge answered criterion {name!r} more than once")
382
- answers[name] = str(entry.get("verdict"))
383
- if sorted(answers) != sorted(by_criterion):
384
- raise ValueError(
385
- f"judge verdicts name {sorted(answers)}, expected the rubric's "
386
- f"{sorted(by_criterion)}"
387
- )
388
- scores: dict[str, float] = {}
389
- for name, answer in answers.items():
390
- choices = by_criterion[name].choices
391
- # An off-menu answer is a judge failure, not a zero score.
392
- if answer not in choices:
393
- raise ValueError(
394
- f"judge answered {answer!r} for '{name}', expected one of {choices}"
395
- )
396
- scores[name] = choices.index(answer) / (len(choices) - 1)
327
+ scores = score_verdicts(verdicts, criteria, "the rubric's")
397
328
  for criterion in criteria:
398
329
  solution.record_metric(f"judge/{criterion.name}", scores[criterion.name])
399
330
  if self.config.score.task_weight != 1.0:
@@ -6,7 +6,7 @@ import random
6
6
  import shlex
7
7
  from typing import Literal
8
8
 
9
- from pydantic import Field, model_validator
9
+ from pydantic import Field, PositiveInt, model_validator
10
10
 
11
11
  from verifiers.v1.clients import ModelContext
12
12
  from verifiers.v1.configs.harness import HarnessConfig
@@ -38,26 +38,18 @@ class RLMHarnessConfig(HarnessConfig):
38
38
  builtin_skills: list[BuiltinSkill] = Field(default_factory=list)
39
39
  """Built-in rlm skills to enable (RLM_SKILLS), e.g. `["edit"]`; empty enables none.
40
40
  The tool set is fixed (ipython); the base `skills` field takes SKILL.md paths."""
41
- summarize_at_tokens: int | tuple[int, int] | None = None
41
+ summarize_at_tokens: PositiveInt | tuple[PositiveInt, PositiveInt] | None = None
42
42
  """Auto-compaction threshold (RLM_SUMMARIZE_AT_TOKENS): compact the context once it grows
43
43
  past this many tokens. An int is a fixed threshold; a `(lo, hi)` pair draws a per-group
44
44
  threshold (seeded by the task index, so a task's rollouts share one draw and tasks vary).
45
45
  `None` disables auto-compaction; ints must be positive."""
46
46
 
47
47
  @model_validator(mode="after")
48
- def validate_limits(self) -> "RLMHarnessConfig":
48
+ def validate_range(self) -> "RLMHarnessConfig":
49
49
  value = self.summarize_at_tokens
50
- if isinstance(value, tuple):
51
- lo, hi = value
52
- if lo <= 0 or hi <= 0:
53
- raise ValueError("`summarize_at_tokens` range bounds must be positive.")
54
- if lo > hi:
55
- raise ValueError(
56
- "`summarize_at_tokens` range must be (lo, hi) with lo <= hi."
57
- )
58
- elif value is not None and value <= 0:
50
+ if isinstance(value, tuple) and value[0] > value[1]:
59
51
  raise ValueError(
60
- "`summarize_at_tokens` must be positive, or None to disable."
52
+ "`summarize_at_tokens` range must be (lo, hi) with lo <= hi."
61
53
  )
62
54
  return self
63
55
 
@@ -30,7 +30,7 @@ from contextlib import asynccontextmanager
30
30
  from typing import Literal
31
31
 
32
32
  from aiohttp import web
33
- from pydantic import TypeAdapter, ValidationError
33
+ from pydantic import ValidationError
34
34
  from pydantic_core import PydanticSerializationError, from_json, to_json
35
35
 
36
36
  from verifiers.v1 import graph
@@ -737,7 +737,7 @@ class InterceptionServer(Interception):
737
737
  state = session.trace.state
738
738
  return web.Response(
739
739
  # TypeAdapter emits UTF-8 bytes directly, avoiding a JSON str copy in aiohttp.
740
- body=TypeAdapter(type(state)).dump_json(state),
740
+ body=session.state_adapter.dump_json(state),
741
741
  content_type="application/json",
742
742
  charset="utf-8",
743
743
  )
@@ -768,7 +768,7 @@ class InterceptionServer(Interception):
768
768
  state_cls = type(session.trace.state)
769
769
  raw = await request.read()
770
770
  try:
771
- new_state = state_cls.model_validate_json(raw)
771
+ new_state = session.state_adapter.validate_json(raw)
772
772
  except ValidationError as e:
773
773
  # Reject malformed, over-nested, or mismatched state before it enters the shared channel.
774
774
  logger.warning("state PUT rejected: id=%s %s", session.trace.id, e)
@@ -2,14 +2,13 @@
2
2
 
3
3
  import asyncio
4
4
  import json
5
- import math
6
5
  import re
7
6
  import tomllib
8
7
  from functools import cached_property
9
8
  from pathlib import Path
10
- from typing import cast
9
+ from typing import Annotated, cast
11
10
 
12
- from pydantic import BaseModel, Field, field_validator
11
+ from pydantic import BaseModel, Field, TypeAdapter, field_validator
13
12
 
14
13
  from verifiers.v1.configs.judge import JudgeConfig
15
14
  from verifiers.v1.judge import Judge, JudgeView, judge_question, judge_response
@@ -17,6 +16,8 @@ from verifiers.v1.task import TaskData
17
16
  from verifiers.v1.trace import Trace
18
17
  from verifiers.v1.types import ID
19
18
 
19
+ CriterionWeight = Annotated[float, Field(ge=0, allow_inf_nan=False)]
20
+
20
21
  RUBRIC_PROMPT = (Path(__file__).resolve().parent / "rubric.txt").read_text(
21
22
  encoding="utf-8"
22
23
  )
@@ -60,29 +61,62 @@ class Criterion(BaseModel):
60
61
  name: str
61
62
  """Key for the criterion's metric (`<judge name>/<name>`) and its `weights` override."""
62
63
  text: str
63
- weight: float = 1.0
64
+ weight: CriterionWeight = 1.0
64
65
  """The criterion's share of the reward (overridable per name via `weights` in config)."""
65
- choices: list[str] = Field(default_factory=lambda: ["no", "yes"])
66
+ choices: list[str] = Field(default_factory=lambda: ["no", "yes"], min_length=2)
66
67
  """Allowed answers, ordered **worst → best**: the first scores 0.0, the last 1.0, the rest
67
68
  evenly spaced by rank. Default `["no", "yes"]` is a binary check. Needs >= 2, no duplicates."""
68
69
 
69
70
  @field_validator("choices")
70
71
  @classmethod
71
72
  def _check_choices(cls, v: list[str]) -> list[str]:
72
- if len(v) < 2:
73
- raise ValueError(f"`choices` needs at least two options, got {v}")
74
73
  if len(set(v)) != len(v):
75
74
  raise ValueError(f"`choices` has duplicate options: {v}")
76
75
  return v
77
76
 
78
77
 
78
+ CRITERIA_ADAPTER = TypeAdapter(list[Criterion])
79
+
80
+
81
+ def load_criteria(
82
+ path: Path, weights: dict[str, CriterionWeight] | None = None
83
+ ) -> list[Criterion]:
84
+ """Load a JSON or TOML rubric and apply validated config overrides."""
85
+ text = path.read_text(encoding="utf-8")
86
+ data = tomllib.loads(text) if path.suffix.lower() == ".toml" else json.loads(text)
87
+ items = data.get("criteria", []) if isinstance(data, dict) else data
88
+ criteria = CRITERIA_ADAPTER.validate_python(items)
89
+ if not criteria:
90
+ raise ValueError(f"rubric file '{path}' lists no criteria")
91
+ names = [criterion.name for criterion in criteria]
92
+ if len(set(names)) != len(names):
93
+ raise ValueError(f"rubric file '{path}' has duplicate criterion names")
94
+ overrides = weights or {}
95
+ if unknown := set(overrides) - set(names):
96
+ raise ValueError(
97
+ f"`weights` overrides name no criterion in '{path}': {sorted(unknown)}"
98
+ )
99
+ criteria = [
100
+ criterion.model_copy(
101
+ update={"weight": overrides.get(criterion.name, criterion.weight)}
102
+ )
103
+ for criterion in criteria
104
+ ]
105
+ total = sum(criterion.weight for criterion in criteria)
106
+ if total == float("inf"):
107
+ raise ValueError(f"rubric '{path}' has a non-finite total criterion weight")
108
+ if total <= 0:
109
+ raise ValueError(f"rubric '{path}' has no positive criterion weight")
110
+ return criteria
111
+
112
+
79
113
  class RubricJudgeConfig(JudgeConfig):
80
114
  id: ID = "rubric"
81
115
  """Pinned to the built-in, so a code-level default entry needs no explicit id."""
82
116
  path: Path
83
117
  """A `.toml` or `.json` file containing a `criteria` list. Relative paths resolve
84
118
  against the evaluation's working directory."""
85
- weights: dict[str, float] = Field(default_factory=dict)
119
+ weights: dict[str, CriterionWeight] = Field(default_factory=dict)
86
120
  """Per-criterion weight overrides by criterion name (config wins over the file)."""
87
121
  question_field: str = ""
88
122
  """Task field to fill the prompt's `{question}`; empty = the task's prompt rendered as
@@ -96,7 +130,7 @@ class RubricJudgeConfig(JudgeConfig):
96
130
  """How much of the rollout fills `{response}` (see `JudgeView`). Defaults to the whole
97
131
  transcript — rubric criteria typically grade the process (tool use, citations,
98
132
  intermediate steps), not just the final answer."""
99
- max_criteria: int | None = None
133
+ max_criteria: int | None = Field(default=None, ge=1)
100
134
  """How many criteria to grade per judge call. `None` (default) grades all criteria in one
101
135
  call. `1` sends one call per criterion (n independent judges); `k` batches them k-at-a-time.
102
136
  Batches are graded concurrently and merged. Smaller batches trade more calls for focus/
@@ -119,45 +153,43 @@ class RubricVerdicts(BaseModel):
119
153
  verdicts: list[CriterionVerdict]
120
154
 
121
155
 
156
+ def score_verdicts(
157
+ verdicts: list[CriterionVerdict],
158
+ criteria: list[Criterion],
159
+ expected: str,
160
+ ) -> dict[str, float]:
161
+ """Validate a complete named verdict set and normalize its ordered choices."""
162
+ by_criterion = {criterion.name: criterion for criterion in criteria}
163
+ answers: dict[str, str] = {}
164
+ for verdict in verdicts:
165
+ if verdict.name in answers:
166
+ raise ValueError(
167
+ f"judge answered criterion {verdict.name!r} more than once"
168
+ )
169
+ answers[verdict.name] = verdict.verdict
170
+ if sorted(answers) != sorted(by_criterion):
171
+ raise ValueError(
172
+ f"judge verdicts name {sorted(answers)}, expected {expected} "
173
+ f"{sorted(by_criterion)}"
174
+ )
175
+ scores: dict[str, float] = {}
176
+ for name, answer in answers.items():
177
+ choices = by_criterion[name].choices
178
+ if answer not in choices:
179
+ raise ValueError(
180
+ f"judge answered {answer!r} for '{name}', expected one of {choices}"
181
+ )
182
+ scores[name] = normalize_choice(answer, choices)
183
+ return scores
184
+
185
+
122
186
  class RubricJudge(Judge[RubricVerdicts, RubricJudgeConfig]):
123
187
  prompt = RUBRIC_PROMPT
124
188
  schema = RubricVerdicts
125
189
 
126
190
  @cached_property
127
191
  def criteria(self) -> list[Criterion]:
128
- path = self.config.path
129
- text = path.read_text(encoding="utf-8")
130
- data = (
131
- tomllib.loads(text) if path.suffix.lower() == ".toml" else json.loads(text)
132
- )
133
- items = data.get("criteria", []) if isinstance(data, dict) else data
134
- criteria = [Criterion.model_validate(item) for item in items]
135
- if not criteria:
136
- raise ValueError(f"rubric file '{path}' lists no criteria")
137
- names = [criterion.name for criterion in criteria]
138
- if len(set(names)) != len(names):
139
- raise ValueError(f"rubric file '{path}' has duplicate criterion names")
140
- if unknown := set(self.config.weights) - set(names):
141
- raise ValueError(
142
- f"`weights` overrides name no criterion in '{path}': {sorted(unknown)}"
143
- )
144
- criteria = [
145
- criterion.model_copy(
146
- update={
147
- "weight": self.config.weights.get(criterion.name, criterion.weight)
148
- }
149
- )
150
- for criterion in criteria
151
- ]
152
- if bad := [c.name for c in criteria if not 0 <= c.weight < math.inf]:
153
- # A negative weight would invert a criterion (pushing the reward out of [0, 1]);
154
- # NaN/inf (which json.loads accepts) would corrupt the weighted mean.
155
- raise ValueError(
156
- f"rubric '{path}' has negative or non-finite criterion weights: {bad}"
157
- )
158
- if sum(criterion.weight for criterion in criteria) <= 0:
159
- raise ValueError(f"rubric '{path}' has no positive criterion weight")
160
- return criteria
192
+ return load_criteria(self.config.path, self.config.weights)
161
193
 
162
194
  async def grade_batch(
163
195
  self, task: TaskData, trace: Trace, batch: list[Criterion]
@@ -205,30 +237,12 @@ class RubricJudge(Judge[RubricVerdicts, RubricJudgeConfig]):
205
237
  f"judge returned no verdicts JSON object: {result.text!r}"
206
238
  )
207
239
  verdicts = RubricVerdicts.model_validate(obj).verdicts
208
- # Exactly one verdict per criterion in the batch, matched by name anything else is a
209
- # judge failure and must error the rollout, not score the model (see `judge_verdict`).
210
- by_criterion = {c.name: c for c in batch}
211
- if sorted(v.name for v in verdicts) != sorted(by_criterion):
212
- raise ValueError(
213
- f"judge verdicts name {sorted(v.name for v in verdicts)}, expected the "
214
- f"batch's {sorted(by_criterion)}"
215
- )
216
- scores: dict[str, float] = {}
217
- for v in verdicts:
218
- choices = by_criterion[v.name].choices
219
- # An off-menu answer is a judge failure, not a zero score.
220
- if v.verdict not in choices:
221
- raise ValueError(
222
- f"judge answered {v.verdict!r} for '{v.name}', expected one of {choices}"
223
- )
224
- scores[v.name] = normalize_choice(v.verdict, choices)
225
- return scores
240
+ # A malformed verdict is a judge failure and must error the rollout, not score the model.
241
+ return score_verdicts(verdicts, batch, "the batch's")
226
242
 
227
243
  async def score(self, task: TaskData, trace: Trace) -> float:
228
244
  criteria = self.criteria
229
245
  k = self.config.max_criteria
230
- if k is not None and k < 1:
231
- raise ValueError(f"`max_criteria` must be >= 1 or None, got {k}")
232
246
  batches = (
233
247
  [criteria]
234
248
  if k is None
@@ -16,11 +16,11 @@ v1 stays importable without the v0 package present.
16
16
  import contextlib
17
17
  import logging
18
18
  from pathlib import Path
19
- from typing import Any
19
+ from typing import Annotated, Any
20
20
 
21
21
  import zmq
22
22
  import zmq.asyncio
23
- from pydantic import ValidationError
23
+ from pydantic import BeforeValidator, OnErrorOmit, TypeAdapter, ValidationError
24
24
 
25
25
  from verifiers.v1 import graph
26
26
  from verifiers.v1.configs.agent import AgentConfig
@@ -76,19 +76,19 @@ def _as_dict(obj: Any) -> Any:
76
76
  return obj
77
77
 
78
78
 
79
+ TOOLS_ADAPTER = TypeAdapter(
80
+ list[OnErrorOmit[Annotated[Tool, BeforeValidator(_as_dict)]]]
81
+ )
82
+
83
+
79
84
  def _to_v1_tools(raw: Any) -> list[Tool] | None:
80
85
  """Map v0 ``RolloutOutput.tool_defs`` onto ``Trace.tools``. The v0 and v1 ``Tool``
81
86
  shapes are identical (name/description/parameters/strict), so this is a re-validation;
82
87
  malformed entries are dropped rather than failing the whole trace mapping."""
83
- defs: list[Tool] = []
84
- for t in raw or []:
85
- t = _as_dict(t)
86
- if not isinstance(t, dict):
87
- continue
88
- try:
89
- defs.append(Tool.model_validate(t))
90
- except ValidationError:
91
- continue
88
+ try:
89
+ defs = TOOLS_ADAPTER.validate_python(raw or [])
90
+ except ValidationError:
91
+ return None
92
92
  return defs or None
93
93
 
94
94
 
@@ -276,8 +276,8 @@ def rollout_output_to_trace(out: dict, task_idx: int) -> Trace:
276
276
  # base task type above.
277
277
  agent=AgentInfo(config=AgentConfig()),
278
278
  tools=_to_v1_tools(out.get("tool_defs")) or [],
279
- rewards={"reward": Reward(score=float(out.get("reward") or 0.0))},
280
- metrics={k: float(v) for k, v in (out.get("metrics") or {}).items()},
279
+ rewards={"reward": Reward(score=out.get("reward") or 0.0)},
280
+ metrics=out.get("metrics") or {},
281
281
  info=dict(out.get("info") or {}),
282
282
  is_completed=bool(out.get("is_completed", True)),
283
283
  # Bridged rollouts are complete by construction; the sentinel mirrors
@@ -11,8 +11,11 @@ import asyncio
11
11
  import logging
12
12
  from collections.abc import Awaitable, Callable
13
13
  from dataclasses import dataclass, field
14
+ from functools import cached_property
14
15
  from typing import TYPE_CHECKING
15
16
 
17
+ from pydantic import TypeAdapter
18
+
16
19
  from verifiers.v1.clients import Client, ModelContext
17
20
  from verifiers.v1.trace import Trace
18
21
 
@@ -96,6 +99,11 @@ class RolloutSession:
96
99
  its client disconnects, so a request whose program died at teardown would keep driving
97
100
  the exchange (upstream call, simulator turn) — unregistering cancels these instead."""
98
101
 
102
+ @cached_property
103
+ def state_adapter(self) -> TypeAdapter:
104
+ """The rollout's state codec, built only when a state channel is used."""
105
+ return TypeAdapter(type(self.trace.state))
106
+
99
107
  def adopt(self, task: "asyncio.Task | None") -> None:
100
108
  """Track a handler task serving this session, for cancellation at release.
101
109
  Callers adopt in the same synchronous stretch that fetched the session, so
File without changes