verifiers 0.2.2.dev47__tar.gz → 0.2.2.dev49__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/PKG-INFO +1 -1
  2. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/pyproject.toml +4 -2
  3. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_e2e.py +20 -20
  4. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_graph.py +16 -6
  5. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_judges.py +4 -0
  6. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_trace.py +4 -1
  7. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/agent.py +12 -12
  8. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/eval.py +13 -16
  9. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/debug.py +4 -11
  10. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/runner.py +3 -3
  11. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/replay.py +3 -9
  12. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/resolve.py +22 -13
  13. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/validate.py +14 -9
  14. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/env.py +1 -1
  15. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/agentic_judge/env.py +1 -1
  16. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/user_sim/env.py +2 -2
  17. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/errors.py +1 -1
  18. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/adapter.py +2 -3
  19. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/legacy.py +6 -2
  20. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/push.py +5 -5
  21. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/retries.py +3 -1
  22. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/rollout.py +23 -20
  23. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/subprocess.py +1 -1
  24. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/task.py +1 -1
  25. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/harbor/taskset.py +4 -4
  26. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/trace.py +135 -238
  27. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/compile.py +8 -8
  28. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/.gitignore +0 -0
  29. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/LICENSE +0 -0
  30. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/README.md +0 -0
  31. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/__init__.py +0 -0
  32. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/conftest.py +0 -0
  33. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_browser_env.py +0 -0
  34. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_build_script.py +0 -0
  35. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_cli_agent_env.py +0 -0
  36. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_auth_errors.py +0 -0
  37. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_config.py +0 -0
  38. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_client_multimodal_types.py +0 -0
  39. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_composable_env.py +0 -0
  40. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_context_token_metrics.py +0 -0
  41. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_decorator_ranks.py +0 -0
  42. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_endpoint_registry.py +0 -0
  43. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_env_group.py +0 -0
  44. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_env_server.py +0 -0
  45. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_environment.py +0 -0
  46. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_environment_extra.py +0 -0
  47. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_error_chain.py +0 -0
  48. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_eval_display.py +0 -0
  49. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_eval_utils.py +0 -0
  50. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gepa_cli.py +0 -0
  51. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gepa_utils.py +0 -0
  52. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_gym_env.py +0 -0
  53. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_harbor_env_mcp.py +0 -0
  54. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_imports.py +0 -0
  55. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_init_script.py +0 -0
  56. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_install_utils.py +0 -0
  57. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_interception_utils.py +0 -0
  58. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_logging.py +0 -0
  59. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_math_rubric.py +0 -0
  60. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_maybe_think_parser.py +0 -0
  61. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_message_utils.py +0 -0
  62. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_message_utils_multimodal.py +0 -0
  63. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_multiturn_env.py +0 -0
  64. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_nemorl_client.py +0 -0
  65. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openai_chat_completions_token_client.py +0 -0
  66. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openai_responses_client.py +0 -0
  67. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_opencode_rlm_env.py +0 -0
  68. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_openenv_client.py +0 -0
  69. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_parser.py +0 -0
  70. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_path_utils.py +0 -0
  71. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_per_turn_timing.py +0 -0
  72. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_pricing_utils.py +0 -0
  73. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_prime_plugin.py +0 -0
  74. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_renderer_client.py +0 -0
  75. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_renderer_e2e.py +0 -0
  76. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rlm_composable_env.py +0 -0
  77. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rubric.py +0 -0
  78. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_rubric_group.py +0 -0
  79. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_debug_env.py +0 -0
  80. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_env.py +0 -0
  81. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_sandbox_mixin.py +0 -0
  82. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_save_utils.py +0 -0
  83. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_setup_script.py +0 -0
  84. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_singleturn_env.py +0 -0
  85. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_stateful_tool_env.py +0 -0
  86. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_think_parser.py +0 -0
  87. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tool_env.py +0 -0
  88. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tool_utils.py +0 -0
  89. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_trajectory_processing.py +0 -0
  90. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_tui_info_formatting.py +0 -0
  91. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_types.py +0 -0
  92. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/test_xml_parser.py +0 -0
  93. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/conftest.py +0 -0
  94. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  95. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/duet_v1.py +0 -0
  96. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  97. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  98. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  99. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  100. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  101. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_v0.py +0 -0
  102. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/echo_v1.py +0 -0
  103. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/pyproject.toml +0 -0
  104. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  105. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_color_codeword_tasks.py +0 -0
  106. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_configs.py +0 -0
  107. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_envs.py +0 -0
  108. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_legacy.py +0 -0
  109. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_scoring.py +0 -0
  110. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/tests/v1/test_taskset.py +0 -0
  111. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/__init__.py +0 -0
  112. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/__init__.py +0 -0
  113. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/__init__.py +0 -0
  114. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/build.py +0 -0
  115. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/eval.py +0 -0
  116. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/gepa.py +0 -0
  117. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/init.py +0 -0
  118. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/install.py +0 -0
  119. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/commands/setup.py +0 -0
  120. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/plugins/__init__.py +0 -0
  121. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/plugins/prime.py +0 -0
  122. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/cli/tui.py +0 -0
  123. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/__init__.py +0 -0
  124. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/anthropic_messages_client.py +0 -0
  125. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/client.py +0 -0
  126. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  127. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_chat_completions_client.py +0 -0
  128. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  129. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_completions_client.py +0 -0
  130. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/openai_responses_client.py +0 -0
  131. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/clients/renderer_client.py +0 -0
  132. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/decorators.py +0 -0
  133. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/__init__.py +0 -0
  134. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/env_group.py +0 -0
  135. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/environment.py +0 -0
  136. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/README.md +0 -0
  137. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/__init__.py +0 -0
  138. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  139. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/README.md +0 -0
  140. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/__init__.py +0 -0
  141. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/_filter.py +0 -0
  142. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  143. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harness.py +0 -0
  144. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  145. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  146. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  147. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  148. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  149. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  150. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  151. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/task.py +0 -0
  152. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  153. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  154. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  155. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  156. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  157. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  158. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  159. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  160. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  161. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  162. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  163. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  164. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  165. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  166. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  167. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  168. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  169. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  170. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  171. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  172. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  173. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  174. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  175. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  176. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  177. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  178. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  179. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  180. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  181. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  182. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  183. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  184. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  185. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  186. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/gym_env.py +0 -0
  187. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  188. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  189. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  190. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/mcp_env.py +0 -0
  191. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_env.py +0 -0
  192. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  193. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  194. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  195. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/__init__.py +0 -0
  196. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  197. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  198. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/README.md +0 -0
  199. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/__init__.py +0 -0
  200. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/README.md +0 -0
  201. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  202. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  203. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  204. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  205. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  206. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  207. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/openenv_env.py +0 -0
  208. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  209. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/integrations/textarena_env.py +0 -0
  210. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/multiturn_env.py +0 -0
  211. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/python_env.py +0 -0
  212. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/sandbox_env.py +0 -0
  213. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/singleturn_env.py +0 -0
  214. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/stateful_tool_env.py +0 -0
  215. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/envs/tool_env.py +0 -0
  216. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/errors.py +0 -0
  217. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/__init__.py +0 -0
  218. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/adapter.py +0 -0
  219. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/config.py +0 -0
  220. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/display.py +0 -0
  221. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/gepa/gepa_utils.py +0 -0
  222. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/__init__.py +0 -0
  223. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/maybe_think_parser.py +0 -0
  224. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/parser.py +0 -0
  225. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/think_parser.py +0 -0
  226. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/parsers/xml_parser.py +0 -0
  227. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/__init__.py +0 -0
  228. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  229. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/judge_rubric.py +0 -0
  230. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/math_rubric.py +0 -0
  231. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/rubric.py +0 -0
  232. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/rubrics/rubric_group.py +0 -0
  233. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/__init__.py +0 -0
  234. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/build.py +0 -0
  235. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/eval.py +0 -0
  236. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/gepa.py +0 -0
  237. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/init.py +0 -0
  238. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/install.py +0 -0
  239. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/setup.py +0 -0
  240. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/scripts/tui.py +0 -0
  241. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/__init__.py +0 -0
  242. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/client/env_client.py +0 -0
  243. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/client/zmq_env_client.py +0 -0
  244. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/__init__.py +0 -0
  245. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_router.py +0 -0
  246. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_server.py +0 -0
  247. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/env_worker.py +0 -0
  248. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/server/zmq_env_server.py +0 -0
  249. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/serve/types.py +0 -0
  250. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/types.py +0 -0
  251. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/__init__.py +0 -0
  252. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/async_utils.py +0 -0
  253. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/client_utils.py +0 -0
  254. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/config_utils.py +0 -0
  255. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/data_utils.py +0 -0
  256. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/display_utils.py +0 -0
  257. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/env_config_utils.py +0 -0
  258. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/env_utils.py +0 -0
  259. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/error_utils.py +0 -0
  260. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/eval_display.py +0 -0
  261. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/eval_utils.py +0 -0
  262. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/heartbeat.py +0 -0
  263. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/import_utils.py +0 -0
  264. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/install_utils.py +0 -0
  265. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/interception_utils.py +0 -0
  266. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/logging_utils.py +0 -0
  267. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/message_utils.py +0 -0
  268. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/metric_utils.py +0 -0
  269. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/path_utils.py +0 -0
  270. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/pricing_utils.py +0 -0
  271. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/process_utils.py +0 -0
  272. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/response_utils.py +0 -0
  273. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/save_utils.py +0 -0
  274. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/serve_utils.py +0 -0
  275. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/thread_utils.py +0 -0
  276. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/threaded_sandbox_client.py +0 -0
  277. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/tool_utils.py +0 -0
  278. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/usage_utils.py +0 -0
  279. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/utils/version_utils.py +0 -0
  280. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/__init__.py +0 -0
  281. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/acp/__init__.py +0 -0
  282. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/acp/_runner.py +0 -0
  283. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/__init__.py +0 -0
  284. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  285. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/base.py +0 -0
  286. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/replay.py +0 -0
  287. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/dashboard/validate.py +0 -0
  288. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/__init__.py +0 -0
  289. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/main.py +0 -0
  290. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/eval/resume.py +0 -0
  291. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/gepa.py +0 -0
  292. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/init.py +0 -0
  293. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/output.py +0 -0
  294. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/cli/serve.py +0 -0
  295. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/__init__.py +0 -0
  296. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/client.py +0 -0
  297. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/config.py +0 -0
  298. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/eval.py +0 -0
  299. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/clients/train.py +0 -0
  300. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/__init__.py +0 -0
  301. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/agent.py +0 -0
  302. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/__init__.py +0 -0
  303. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/debug.py +0 -0
  304. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/env.py +0 -0
  305. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/eval.py +0 -0
  306. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/init.py +0 -0
  307. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/replay.py +0 -0
  308. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/serve.py +0 -0
  309. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/cli/validate.py +0 -0
  310. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/env.py +0 -0
  311. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/harness.py +0 -0
  312. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/judge.py +0 -0
  313. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/legacy.py +0 -0
  314. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/retries.py +0 -0
  315. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/serve.py +0 -0
  316. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/task.py +0 -0
  317. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/configs/taskset.py +0 -0
  318. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/decorators.py +0 -0
  319. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/__init__.py +0 -0
  320. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/anthropic.py +0 -0
  321. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/base.py +0 -0
  322. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/chat.py +0 -0
  323. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/dialects/responses.py +0 -0
  324. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/__init__.py +0 -0
  325. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  326. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  327. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/best_of_n/env.py +0 -0
  328. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  329. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/single_agent/env.py +0 -0
  330. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  331. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/episode.py +0 -0
  332. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/__init__.py +0 -0
  333. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/config.py +0 -0
  334. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/dataset.py +0 -0
  335. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/reflection.py +0 -0
  336. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/gepa/runner.py +0 -0
  337. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/graph.py +0 -0
  338. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harness.py +0 -0
  339. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/__init__.py +0 -0
  340. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  341. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/harness.py +0 -0
  342. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/bash/program.py +0 -0
  343. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  344. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  345. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  346. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/codex/harness.py +0 -0
  347. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  348. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  349. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  350. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  351. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  352. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/__init__.py +0 -0
  353. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/harness.py +0 -0
  354. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/null/program.py +0 -0
  355. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  356. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pi/harness.py +0 -0
  357. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  358. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/pool/harness.py +0 -0
  359. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  360. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  361. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  362. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  363. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  364. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/__init__.py +0 -0
  365. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/base.py +0 -0
  366. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/pool.py +0 -0
  367. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/server.py +0 -0
  368. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  369. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/base.py +0 -0
  370. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/custom.py +0 -0
  371. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/interception/tunnel/prime.py +0 -0
  372. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judge.py +0 -0
  373. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/__init__.py +0 -0
  374. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/reference.py +0 -0
  375. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/reference.txt +0 -0
  376. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/rubric.py +0 -0
  377. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/judges/rubric.txt +0 -0
  378. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/loaders.py +0 -0
  379. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/__init__.py +0 -0
  380. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/launch.py +0 -0
  381. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/server.py +0 -0
  382. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/mcp/toolset.py +0 -0
  383. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/__init__.py +0 -0
  384. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/base.py +0 -0
  385. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/docker/__init__.py +0 -0
  386. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/docker/egress.py +0 -0
  387. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/limiters.py +0 -0
  388. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/modal.py +0 -0
  389. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/runtimes/prime.py +0 -0
  390. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/scoring.py +0 -0
  391. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/__init__.py +0 -0
  392. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/client.py +0 -0
  393. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/pool.py +0 -0
  394. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/server.py +0 -0
  395. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/serve/types.py +0 -0
  396. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/session.py +0 -0
  397. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/state.py +0 -0
  398. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/taskset.py +0 -0
  399. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/__init__.py +0 -0
  400. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  401. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  402. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  403. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  404. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  405. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  406. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  407. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  408. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/types.py +0 -0
  409. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/__init__.py +0 -0
  410. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/aio.py +0 -0
  411. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/format.py +0 -0
  412. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/generic.py +0 -0
  413. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/git.py +0 -0
  414. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/image.py +0 -0
  415. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/install.py +0 -0
  416. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/interrupt.py +0 -0
  417. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/logging.py +0 -0
  418. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/memory.py +0 -0
  419. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/verifiers/v1/utils/sampling.py +0 -0
  420. {verifiers-0.2.2.dev47 → verifiers-0.2.2.dev49}/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.dev47
3
+ Version: 0.2.2.dev49
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
@@ -136,8 +136,10 @@ kuhn-poker-v1 = { path = "environments/kuhn_poker_v1", editable = true }
136
136
 
137
137
  [tool.uv.exclude-newer-package]
138
138
  # Bounded cutoffs for the explicitly requested tool upgrades.
139
- ruff = "2026-07-27"
140
- ty = "2026-07-27"
139
+ # Full UTC timestamps: bare dates resolve to local-tz midnight and churn the
140
+ # lockfile across timezones.
141
+ ruff = "2026-07-28T00:00:00Z"
142
+ ty = "2026-07-28T00:00:00Z"
141
143
  # PrimeIntellect-published on PyPI (trusted publisher)
142
144
  prime-tunnel = false
143
145
  prime-sandboxes = false
@@ -229,7 +229,7 @@ async def test_tool(run_v1, harness_runtime, tool_runtime, tmp_path):
229
229
  assert trace.reward == 1.0
230
230
  # The interception server captured the advertised tools onto the trace (for tool-use SFT):
231
231
  # the null harness offered the task's MCP tool as `echo_back`, schema included.
232
- assert trace.tools is not None
232
+ assert trace.tools
233
233
  (echo_tool,) = [t for t in trace.tools if t.name == "echo_back"]
234
234
  assert "message" in echo_tool.parameters.get("properties", {})
235
235
 
@@ -355,9 +355,9 @@ async def test_multi_agent_env(run_v1, tmp_path):
355
355
  max_turns=2,
356
356
  )
357
357
  assert len(traces) == 2 # one episode, one trace per role
358
- assert sorted(t.agent_name for t in traces) == ["a", "b"]
359
- (b,) = [t for t in traces if t.agent_name == "b"]
360
- assert b.trainable is False
358
+ assert sorted(t.agent.name for t in traces) == ["a", "b"]
359
+ (b,) = [t for t in traces if t.agent.name == "b"]
360
+ assert b.agent.trainable is False
361
361
  for trace in traces:
362
362
  assert trace.ok
363
363
  assert trace.reward == 1.0 # each seat's own task reward
@@ -385,7 +385,7 @@ async def test_env_id_best_of_n(run_v1, tmp_path):
385
385
  max_turns=2,
386
386
  )
387
387
  assert len(traces) == 2 # one episode, two attempts
388
- assert all(t.agent_name == "agent" and t.ok for t in traces)
388
+ assert all(t.agent.name == "agent" and t.ok for t in traces)
389
389
  assert any(t.metrics["best"] == 1.0 for t in traces)
390
390
  assert all(t.metrics["pass_at_n"] == 1.0 for t in traces) # echo always passes
391
391
 
@@ -423,11 +423,11 @@ async def test_env_id_agentic_judge(run_v1, tmp_path):
423
423
  max_turns=10,
424
424
  rollout_timeout=600,
425
425
  )
426
- assert sorted(t.agent_name for t in traces) == ["judge", "solver"]
427
- (solver,) = [t for t in traces if t.agent_name == "solver"]
428
- (judge,) = [t for t in traces if t.agent_name == "judge"]
426
+ assert sorted(t.agent.name for t in traces) == ["judge", "solver"]
427
+ (solver,) = [t for t in traces if t.agent.name == "solver"]
428
+ (judge,) = [t for t in traces if t.agent.name == "judge"]
429
429
  assert solver.ok and judge.ok
430
- assert judge.trainable is False
430
+ assert judge.agent.trainable is False
431
431
  # The task's own reward keeps its raw score; the rescale lands on the weight.
432
432
  assert solver.rewards["echoed"].score == 1.0
433
433
  assert solver.rewards["echoed"].weight == 0.5
@@ -448,11 +448,11 @@ async def test_env_id_user_sim(run_v1, tmp_path):
448
448
  max_turns=6,
449
449
  rollout_timeout=300,
450
450
  )
451
- assert sorted(t.agent_name for t in traces) == ["assistant", "user"]
452
- (assistant,) = [t for t in traces if t.agent_name == "assistant"]
453
- (user,) = [t for t in traces if t.agent_name == "user"]
451
+ assert sorted(t.agent.name for t in traces) == ["assistant", "user"]
452
+ (assistant,) = [t for t in traces if t.agent.name == "assistant"]
453
+ (user,) = [t for t in traces if t.agent.name == "user"]
454
454
  assert assistant.ok and user.ok
455
- assert user.trainable is False
455
+ assert user.agent.trainable is False
456
456
  assert user.num_turns >= 1 # the modeled user actually spoke
457
457
  assert assistant.metrics["user_turns"] >= 1
458
458
  # `mask_prompt`: the scenario is hidden from the assistant's harness (the run's
@@ -465,7 +465,7 @@ async def test_env_id_user_sim(run_v1, tmp_path):
465
465
  from verifiers.v1.trace import WireTrace
466
466
 
467
467
  (record,) = read_episodes(tmp_path, WireTrace)
468
- assert {t.agent_name for t in record.traces} == {"assistant", "user"}
468
+ assert {t.agent.name for t in record.traces} == {"assistant", "user"}
469
469
  assert record.id # both traces are persisted under one durable episode identity
470
470
 
471
471
 
@@ -488,14 +488,14 @@ async def test_env_id_user_sim_with_tools(run_v1, tmp_path):
488
488
  max_tokens=8192,
489
489
  rollout_timeout=300,
490
490
  )
491
- (assistant,) = [t for t in traces if t.agent_name == "assistant"]
492
- (user,) = [t for t in traces if t.agent_name == "user"]
491
+ (assistant,) = [t for t in traces if t.agent.name == "assistant"]
492
+ (user,) = [t for t in traces if t.agent.name == "user"]
493
493
  assert assistant.ok and user.ok
494
494
  assert assistant.task.data.prompt is None # the scenario stayed off the wire
495
495
  assert user.num_turns >= 1 # the modeled user actually drove the exchange
496
496
  assert assistant.rewards["echoed"].score == 1.0 # the tool ran, mid-conversation
497
497
  # The tool was advertised to the masked chat exactly as to any run.
498
- assert assistant.tools is not None
498
+ assert assistant.tools
499
499
  assert any(tool.name == "echo_back" for tool in assistant.tools)
500
500
 
501
501
 
@@ -514,8 +514,8 @@ async def test_kuhn_poker_self_play(run_v1, tmp_path):
514
514
  max_tokens=8192,
515
515
  rollout_timeout=300,
516
516
  )
517
- assert sorted(t.agent_name for t in traces) == ["player0", "player1"]
518
- payoffs = {t.agent_name: t.rewards["payoff"].score for t in traces}
517
+ assert sorted(t.agent.name for t in traces) == ["player0", "player1"]
518
+ payoffs = {t.agent.name: t.rewards["payoff"].score for t in traces}
519
519
  assert payoffs["player0"] + payoffs["player1"] == 0 # zero-sum
520
520
  assert abs(payoffs["player0"]) in (1.0, 2.0)
521
521
  for trace in traces:
@@ -542,7 +542,7 @@ async def test_multi_agent_env_server(run_v1_server, tmp_path):
542
542
  max_turns=2,
543
543
  )
544
544
  assert len(traces) == 2
545
- assert sorted(t.agent_name for t in traces) == ["a", "b"]
545
+ assert sorted(t.agent.name for t in traces) == ["a", "b"]
546
546
  for trace in traces:
547
547
  assert trace.ok
548
548
  assert trace.metrics["duet"] == 1.0
@@ -40,7 +40,8 @@ def test_routed_experts_attributed_and_aligned_across_turns():
40
40
  concatenates back to a `[tokens, layers, top_k]` array aligned 1:1 with `branch.token_ids` —
41
41
  and survives the base64 wire round-trip."""
42
42
  trace = vf.Trace(
43
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
43
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
44
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
44
45
  )
45
46
  user = vf.UserMessage(content="u1")
46
47
  graph.prepare_turn(trace, [user]).commit(
@@ -94,7 +95,8 @@ def test_routed_experts_none_when_absent():
94
95
  """No routing captured (engine ran without `enable_return_routed_experts`) -> the branch
95
96
  reports None and the trainer simply skips replay."""
96
97
  trace = vf.Trace(
97
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
98
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
99
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
98
100
  )
99
101
  graph.prepare_turn(trace, [vf.UserMessage(content="u1")]).commit(
100
102
  vf.Response(
@@ -128,7 +130,10 @@ def test_tool_call_hash_matches_v0_content_and_arguments_normalization():
128
130
 
129
131
  def test_reasoning_content_participates_in_graph_prefix_matching():
130
132
  task = vf.TaskData(idx=0, prompt="use a tool")
131
- trace = vf.Trace(task=vf.TraceTask(type="Task", data=task))
133
+ trace = vf.Trace(
134
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
135
+ task=vf.TraceTask(type="Task", data=task),
136
+ )
132
137
  user = vf.UserMessage(content="use a tool")
133
138
  call = vf.ToolCall(id="call_0", name="lookup", arguments="{}")
134
139
 
@@ -205,7 +210,8 @@ def test_renderer_level_break_forks_by_token_id():
205
210
 
206
211
  # Control: the prior turn re-renders to the same tokens -> stays one linear branch.
207
212
  linear = vf.Trace(
208
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
213
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
214
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
209
215
  )
210
216
  first_turn(linear)
211
217
  second_turn(linear, [1, 2, 3, 4, 5, 6, 7])
@@ -214,7 +220,8 @@ def test_renderer_level_break_forks_by_token_id():
214
220
 
215
221
  # Break: the assistant turn retokenizes (4 -> 99), so prompt_ids diverge at that node.
216
222
  broken = vf.Trace(
217
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x"))
223
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
224
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=0, prompt="x")),
218
225
  )
219
226
  first_turn(broken)
220
227
  second_turn(broken, [1, 2, 3, 99, 5, 6, 7])
@@ -227,7 +234,10 @@ def test_renderer_level_break_forks_by_token_id():
227
234
 
228
235
  def test_prompt_supplied_assistant_messages_are_not_sampled_turns():
229
236
  task = vf.TaskData(idx=0, prompt="few-shot")
230
- trace = vf.Trace(task=vf.TraceTask(type="Task", data=task))
237
+ trace = vf.Trace(
238
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
239
+ task=vf.TraceTask(type="Task", data=task),
240
+ )
231
241
  fabricated = vf.AssistantMessage(
232
242
  content=None,
233
243
  tool_calls=[vf.ToolCall(id="call_0", name="lookup", arguments="{}")],
@@ -36,6 +36,7 @@ def make_trace(
36
36
  task_cls: type[QAData] = QAData,
37
37
  ) -> vf.Trace:
38
38
  return vf.Trace(
39
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
39
40
  task=vf.TraceTask(
40
41
  type="Task",
41
42
  data=task_cls(idx=0, prompt="Capital of France?", answer=answer),
@@ -244,6 +245,7 @@ async def test_reference_score_messages_prompt(fake_judge_model):
244
245
  answer="Paris",
245
246
  )
246
247
  trace = vf.Trace(
248
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
247
249
  task=vf.TraceTask(type="Task", data=task),
248
250
  nodes=[
249
251
  MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
@@ -269,6 +271,7 @@ async def test_reference_question_field(fake_judge_model):
269
271
  answer="Paris",
270
272
  )
271
273
  trace = vf.Trace(
274
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
272
275
  task=vf.TraceTask(type="Task", data=task),
273
276
  nodes=[
274
277
  MessageNode(parent=None, message=UserMessage(content="q"), sampled=False),
@@ -293,6 +296,7 @@ def full_trace_fixture() -> vf.Trace:
293
296
  from verifiers.v1.types import ToolCall, ToolMessage
294
297
 
295
298
  return vf.Trace(
299
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
296
300
  task=vf.TraceTask(
297
301
  type="Task", data=QAData(idx=0, prompt="Capital of France?", answer="Paris")
298
302
  ),
@@ -21,7 +21,8 @@ class MyState(vf.State):
21
21
  def test_bare_trace_round_trip():
22
22
  # The minimal trace: a base task, no nodes, no extras — dump and back into a plain Trace.
23
23
  tr = vf.Trace(
24
- task=vf.TraceTask(type="Task", data=vf.TaskData(idx=3, prompt="hello"))
24
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
25
+ task=vf.TraceTask(type="Task", data=vf.TaskData(idx=3, prompt="hello")),
25
26
  )
26
27
  rt = vf.Trace.model_validate(tr.model_dump())
27
28
  assert rt.id == tr.id
@@ -35,6 +36,7 @@ def test_custom_task_state_round_trip():
35
36
  # Custom data and state round-trip into the same parameterization. Data fields are
36
37
  # typed (not just `model_extra`); `state` is runtime-only and never crosses the wire.
37
38
  tr = vf.Trace[MyTask, MyState](
39
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
38
40
  task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="gold")),
39
41
  state=MyState(score=7),
40
42
  nodes=[
@@ -59,6 +61,7 @@ def test_wire_trace_round_trip():
59
61
  # Two leaves off one root → 2 branches (a compaction-shaped trace), so the round-trip has to
60
62
  # carry node `parent` links for `num_branches` to survive.
61
63
  tr = vf.Trace[MyTask, vf.State](
64
+ agent=vf.AgentInfo(config=vf.AgentConfig()),
62
65
  task=vf.TraceTask(type="MyTask", data=MyTask(idx=0, prompt="q", answer="a")),
63
66
  tools=[vf.Tool(name="echo", description="", parameters={"type": "object"})],
64
67
  nodes=[
@@ -45,7 +45,7 @@ from verifiers.v1.types import (
45
45
  UserMessage,
46
46
  )
47
47
  from verifiers.v1.utils.compile import (
48
- cap_remote_harness_timeout,
48
+ cap_remote_agent_timeout,
49
49
  resolve_runtime_config,
50
50
  validate_pairing,
51
51
  )
@@ -390,7 +390,7 @@ class Agent:
390
390
  attempt + 1,
391
391
  retry.max_retries,
392
392
  delay,
393
- trace.error.type if trace.error else "?",
393
+ trace.last_error.type if trace.last_error else "?",
394
394
  )
395
395
  await asyncio.sleep(delay)
396
396
  if history:
@@ -419,8 +419,8 @@ class Agent:
419
419
  # close() never runs — free the run's servers and owned runtime first.
420
420
  await run.abort()
421
421
  raise
422
- if trace.runtime is not None:
423
- trace.runtime.borrowed = runtime is not None
422
+ if trace.agent.runtime is not None:
423
+ trace.agent.runtime.borrowed = runtime is not None
424
424
  return trace
425
425
 
426
426
  @asynccontextmanager
@@ -482,8 +482,8 @@ class Agent:
482
482
  opened = await run.open()
483
483
  if not opened:
484
484
  trace = await run.close()
485
- if trace.runtime is not None:
486
- trace.runtime.borrowed = runtime is not None
485
+ if trace.agent.runtime is not None:
486
+ trace.agent.runtime.borrowed = runtime is not None
487
487
  if not opened:
488
488
  failure = run.failure
489
489
  if failure is None: # `open()` returning False always captures one.
@@ -499,8 +499,8 @@ class Agent:
499
499
  raise
500
500
  finally:
501
501
  trace = run.trace if run.closed else await interaction.close()
502
- if trace.runtime is not None:
503
- trace.runtime.borrowed = runtime is not None
502
+ if trace.agent.runtime is not None:
503
+ trace.agent.runtime.borrowed = runtime is not None
504
504
 
505
505
  def _rollout_params(
506
506
  self, task: Task, runtime: Runtime | None, shared_tools: dict
@@ -520,10 +520,10 @@ class Agent:
520
520
  self.harness, type(task), runtime_config, shared_tools=shared_tools
521
521
  )
522
522
  # Timeout precedence: agent-level wins, else the task's, else no limit.
523
- harness_timeout = (
523
+ agent_timeout = (
524
524
  self.timeout.rollout
525
525
  if self.timeout.rollout is not None
526
- else task.data.timeout.harness
526
+ else task.data.timeout.agent
527
527
  )
528
528
  return {
529
529
  "agent_config": self.config,
@@ -535,8 +535,8 @@ class Agent:
535
535
  if self.timeout.setup is not None
536
536
  else task.data.timeout.setup
537
537
  ),
538
- "harness_timeout": cap_remote_harness_timeout(
539
- harness_timeout, runtime_config, task
538
+ "agent_timeout": cap_remote_agent_timeout(
539
+ agent_timeout, runtime_config, task
540
540
  ),
541
541
  "finalize_timeout": (
542
542
  self.timeout.finalize
@@ -302,7 +302,7 @@ def Progress(
302
302
  # run, a modeled user) are `trainable=False` and carry no rewards, so counting
303
303
  # them dilutes every mean with structural zeros. An all-untrainable run (every
304
304
  # role frozen) falls back to all traces rather than showing nothing.
305
- scored = [t for t in done_traces if t.trainable] or done_traces
305
+ scored = [t for t in done_traces if t.agent.trainable] or done_traces
306
306
  total = len(slots)
307
307
  # Headline reward = mean over non-errored traces; when any errored, `format_mean` appends
308
308
  # the global avg (errored count as 0) in parens. `err` is the share of episodes that
@@ -367,13 +367,13 @@ def _breakdown(scored: list[Trace], done: list[Trace]) -> Table | None:
367
367
  # show); usage/time below still cover errored rollouts (their resources were spent regardless).
368
368
  has_clean = any(not t.has_error for t in done)
369
369
  score_rows = (("rewards", "rewards"), ("metrics", "metrics")) if has_clean else ()
370
- by_agent: dict[str | None, list[Trace]] = {}
370
+ by_agent: dict[str, list[Trace]] = {}
371
371
  for trace in done:
372
- by_agent.setdefault(trace.agent_name, []).append(trace)
372
+ by_agent.setdefault(trace.agent.name, []).append(trace)
373
373
  for label, source in score_rows:
374
374
  if len(by_agent) > 1:
375
375
  segments = [
376
- f"[dim]{name or '—'}:[/dim] {means}"
376
+ f"[dim]{name}:[/dim] {means}"
377
377
  for name, traces in by_agent.items()
378
378
  if (means := _score_segments(traces, source)) is not None
379
379
  ]
@@ -505,7 +505,7 @@ def _stage(trace: Trace) -> str:
505
505
  stage = "boot" # trace minted, first span not yet opened (an instant)
506
506
  # A boot stuck on a first-use platform image build reads differently from a
507
507
  # normal boot — it can sit there for ~10 minutes (prime runtime only).
508
- if stage == "boot" and getattr(trace.runtime, "image_cached", None) is False:
508
+ if stage == "boot" and getattr(trace.agent.runtime, "image_cached", None) is False:
509
509
  return "build"
510
510
  return stage
511
511
 
@@ -564,14 +564,14 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
564
564
  group_rows.append(("pending", [f"task {base}", *[""] * 7], "", ""))
565
565
  continue
566
566
  for t in slot.traces:
567
- label = f"{base} agent={t.agent_name}" if t.agent_name else base
567
+ label = f"{base} agent={t.agent.name}"
568
568
  if slot.done: # fully scored — reward is final
569
569
  state = "error" if t.has_error else "success"
570
570
  # A trace that recorded nothing shows no reward: a judge or
571
571
  # modeled-user seat's `reward=0.00` would read as a score.
572
572
  result = (
573
- t.error.type
574
- if t.has_error
573
+ t.last_error.type
574
+ if t.has_error and t.last_error
575
575
  else (f"reward={t.reward:.2f}" if t.rewards else "")
576
576
  )
577
577
  if t.has_error:
@@ -582,7 +582,7 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
582
582
  t.is_truncated
583
583
  ): # flag a clipped rollout next to its stop condition
584
584
  stop = f"{stop} (truncated)".strip()
585
- elif t.is_completed and (err := t.error) is not None:
585
+ elif t.is_completed and (err := t.last_error) is not None:
586
586
  # An errored trace whose episode is still running its other
587
587
  # traces (or `score()`) is already a failure — show it, don't
588
588
  # let it sit as "scoring" until the whole episode lands.
@@ -592,12 +592,9 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
592
592
  # The trace's own stamp, not the run-level runtime: a role's harness
593
593
  # may resolve elsewhere (the judge env's sandboxed judge on a
594
594
  # subprocess run).
595
- if t.runtime is not None:
596
- runtime = (
597
- f"{t.runtime.type}({t.runtime.id})"
598
- if t.runtime.id
599
- else t.runtime.type
600
- )
595
+ if t.agent.runtime is not None:
596
+ rt = t.agent.runtime
597
+ runtime = f"{rt.type}({rt.id})" if rt.id else rt.type
601
598
  else:
602
599
  runtime = runtime_type
603
600
  turns = t.num_turns
@@ -635,7 +632,7 @@ def Rows(groups: list[list[RunSlot]], now: float, runtime_type: str) -> Table:
635
632
  f"{nbranches} branch{'es' * (nbranches != 1)}",
636
633
  tokens,
637
634
  f"{format_cost_usd(cost)}" if cost is not None else "",
638
- stop, # stop condition (agent_completed / max_turns / harness_timeout), once done
635
+ stop, # stop condition (agent_completed / max_turns / error), once done
639
636
  ]
640
637
  # No start time yet (queued, not generating) → blank, not `now - 0` (~56 years).
641
638
  elapsed = format_time(end - start) if start else ""
@@ -18,6 +18,7 @@ import verifiers.v1 as vf
18
18
  from verifiers.v1.cli.output import append_trace, save_config
19
19
  from verifiers.v1.cli.resolve import (
20
20
  extract_id,
21
+ narrow_taskset_config,
21
22
  plugin_errors,
22
23
  references_config_file,
23
24
  with_positional_taskset,
@@ -43,15 +44,7 @@ USAGE = (
43
44
 
44
45
  def _narrow(argv: list[str]) -> type[DebugConfig]:
45
46
  """`DebugConfig` with `taskset` narrowed to the config type of the id on the CLI."""
46
- taskset_id = extract_id(argv, "taskset")
47
- if not taskset_id:
48
- return DebugConfig
49
- ftype = vf.taskset_config_type(taskset_id)
50
- return type(
51
- DebugConfig.__name__,
52
- (DebugConfig,),
53
- {"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
54
- )
47
+ return narrow_taskset_config(DebugConfig, extract_id(argv, "taskset"))
55
48
 
56
49
 
57
50
  def output_path(config: DebugConfig) -> Path:
@@ -108,9 +101,9 @@ def error_info(
108
101
 
109
102
 
110
103
  def capture_trace_error(trace: Trace, error: BaseException) -> None:
111
- # CancelledError is a BaseException; Trace.capture_error accepts Exception.
104
+ # CancelledError is a BaseException; Trace.record_error accepts Exception.
112
105
  if isinstance(error, Exception):
113
- trace.capture_error(error)
106
+ trace.record_error(error)
114
107
  return
115
108
  trace.errors.append(
116
109
  Error(
@@ -68,7 +68,7 @@ async def run_eval(env: Env, config: EvalConfig) -> list[Episode]:
68
68
 
69
69
  async def on_complete(episode: Episode) -> None:
70
70
  for trace in episode.traces:
71
- trace.stamp(EvalRunInfo(id=config.uuid))
71
+ trace.record_run(EvalRunInfo(id=config.uuid))
72
72
  await append_episode(out, episode, write_lock)
73
73
 
74
74
  # Serving resources (shared tool servers, interception) come up once for the
@@ -240,7 +240,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
240
240
  )
241
241
  records = []
242
242
  for trace in traces:
243
- trace.stamp(EvalRunInfo(id=config.uuid))
243
+ trace.record_run(EvalRunInfo(id=config.uuid))
244
244
  await append_trace(out, trace, write_lock, env=config.env_id)
245
245
  records.append(Episode.of(trace))
246
246
  return records
@@ -254,7 +254,7 @@ async def run_eval_server(config: EvalConfig) -> list[Episode]:
254
254
  **payload,
255
255
  )
256
256
  for trace in episode.traces:
257
- trace.stamp(EvalRunInfo(id=config.uuid))
257
+ trace.record_run(EvalRunInfo(id=config.uuid))
258
258
  await append_episode(out, episode, write_lock)
259
259
  return [episode]
260
260
 
@@ -27,6 +27,7 @@ from verifiers.v1.cli.output import (
27
27
  save_config,
28
28
  write_config,
29
29
  )
30
+ from verifiers.v1.cli.resolve import narrow_taskset_config
30
31
  from verifiers.v1.configs.agent import WireAgentConfig
31
32
  from verifiers.v1.configs.cli.replay import ReplayConfig
32
33
  from verifiers.v1.state import state_cls
@@ -49,14 +50,7 @@ def _narrow(config_path: Path) -> type[ReplayConfig]:
49
50
  data = tomllib.loads(config_path.read_text())
50
51
  taskset = data.get("taskset") or (data.get("env") or {}).get("taskset") or {}
51
52
  taskset_id = taskset.get("id")
52
- if not taskset_id:
53
- return ReplayConfig
54
- ftype = vf.taskset_config_type(taskset_id)
55
- return type(
56
- "ReplayConfig",
57
- (ReplayConfig,),
58
- {"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
59
- )
53
+ return narrow_taskset_config(ReplayConfig, taskset_id)
60
54
 
61
55
 
62
56
  def output_dir(config: ReplayConfig) -> Path:
@@ -171,7 +165,7 @@ async def run_replay(config: ReplayConfig, source: Path, out: Path) -> list[Trac
171
165
  st.state, st.detail = "scored", f"reward {trace.reward:.3f}"
172
166
  except Exception as exc:
173
167
  st.state, st.detail = "error", type(exc).__name__
174
- trace.capture_error(exc)
168
+ trace.record_error(exc)
175
169
  if not config.rich:
176
170
  logger.warning(
177
171
  "replay: scoring failed for task %s",
@@ -8,9 +8,14 @@ states explicitly is pre-narrowed — never to a type a config file could contra
8
8
  """
9
9
 
10
10
  import contextlib
11
+ from typing import TypeVar
12
+
13
+ from pydantic import BaseModel, create_model
11
14
 
12
15
  import verifiers.v1 as vf
13
16
 
17
+ ConfigT = TypeVar("ConfigT", bound=BaseModel)
18
+
14
19
 
15
20
  @contextlib.contextmanager
16
21
  def plugin_errors():
@@ -68,7 +73,19 @@ def extract_id(argv: list[str], field: str, default: str = "") -> str:
68
73
  return found[0] if found else default
69
74
 
70
75
 
71
- def narrow_config(base: type, argv: list[str]) -> type:
76
+ def narrow_taskset_config(base: type[ConfigT], taskset_id: str | None) -> type[ConfigT]:
77
+ """Narrow a CLI config's taskset field to the selected plugin config."""
78
+ if not taskset_id:
79
+ return base
80
+ taskset_type = vf.taskset_config_type(taskset_id)
81
+ return create_model(
82
+ base.__name__,
83
+ __base__=base,
84
+ taskset=(taskset_type, taskset_type(id=taskset_id)),
85
+ )
86
+
87
+
88
+ def narrow_config(base: type[ConfigT], argv: list[str]) -> type[ConfigT]:
72
89
  """`base` with its `env` field narrowed to the config class of the env the CLI
73
90
  names (`--env.id`, else the taskset's own env, else the single-agent env),
74
91
  including its `taskset` sub-field. Ids a config file may set are left to the
@@ -81,18 +98,10 @@ def narrow_config(base: type, argv: list[str]) -> type:
81
98
  env_type = vf.env_config_type(taskset_id, env_id)
82
99
  if taskset_id:
83
100
  # Nested narrowing: `--env.taskset.<knob>` parses typed and renders in -h.
84
- taskset_type = vf.taskset_config_type(taskset_id)
85
- env_type = type(
86
- env_type.__name__,
87
- (env_type,),
88
- {
89
- "__annotations__": {"taskset": taskset_type},
90
- "taskset": taskset_type(id=taskset_id),
91
- },
92
- )
101
+ env_type = narrow_taskset_config(env_type, taskset_id)
93
102
  default = env_type(id=env_id) if env_id else env_type()
94
- return type(
103
+ return create_model(
95
104
  base.__name__,
96
- (base,),
97
- {"__annotations__": {"env": env_type}, "env": default},
105
+ __base__=base,
106
+ env=(env_type, default),
98
107
  )
@@ -14,6 +14,7 @@ import verifiers.v1 as vf
14
14
  from verifiers.v1.cli.dashboard import TaskProgress, validate_dashboard
15
15
  from verifiers.v1.cli.resolve import (
16
16
  extract_id,
17
+ narrow_taskset_config,
17
18
  plugin_errors,
18
19
  references_config_file,
19
20
  with_positional_taskset,
@@ -41,15 +42,7 @@ def _narrow(argv: list[str]) -> type[ValidateConfig]:
41
42
  """`ValidateConfig` with `taskset` narrowed to the config type of the id on the CLI — so
42
43
  the single `cli()` parse stays typed and `-h` renders the taskset's fields. Absent an id
43
44
  (a `@ file.toml` may carry it) the base type is left for the validator to resolve."""
44
- taskset_id = extract_id(argv, "taskset")
45
- if not taskset_id:
46
- return ValidateConfig
47
- ftype = vf.taskset_config_type(taskset_id)
48
- return type(
49
- ValidateConfig.__name__,
50
- (ValidateConfig,),
51
- {"__annotations__": {"taskset": ftype}, "taskset": ftype(id=taskset_id)},
52
- )
45
+ return narrow_taskset_config(ValidateConfig, extract_id(argv, "taskset"))
53
46
 
54
47
 
55
48
  ResultRow = dict[str, Any]
@@ -96,6 +89,12 @@ async def _run_gold(task: Task, config: ValidateConfig) -> ResultRow:
96
89
  trace = Trace(
97
90
  task=TraceTask(type=type(task).__name__, data=task.data),
98
91
  state=state_cls(type(task))(),
92
+ # No agent runs here — the info only records the runtime policy.
93
+ agent=vf.AgentInfo(
94
+ config=vf.AgentConfig(runtime=config.runtime),
95
+ name="validate",
96
+ trainable=False,
97
+ ),
99
98
  )
100
99
  await runtime.start()
101
100
  await asyncio.wait_for(
@@ -131,6 +130,12 @@ async def _run_setup(task: Task, config: ValidateConfig) -> ResultRow:
131
130
  trace = Trace(
132
131
  task=TraceTask(type=type(task).__name__, data=task.data),
133
132
  state=state_cls(type(task))(),
133
+ # No agent runs here — the info only records the runtime policy.
134
+ agent=vf.AgentInfo(
135
+ config=vf.AgentConfig(runtime=config.runtime),
136
+ name="validate",
137
+ trainable=False,
138
+ ),
134
139
  )
135
140
  await runtime.start()
136
141
  await asyncio.wait_for(
@@ -163,7 +163,7 @@ class Env(ABC, Generic[ConfigT]):
163
163
  """Cross-agent judgement — THE programmable judgement surface: plain
164
164
  imperative Python over the finished episode (per-trace judgement already
165
165
  ran on each trace's own task). `episode.traces` is the flat episode in
166
- completion order, each trace's `agent_name` stamp naming its agent; attach
166
+ completion order, each trace's `agent.name` stamp naming its agent; attach
167
167
  signals via `record_reward`/`record_metric`, in program order. A raise
168
168
  fails the episode (the retryable unit) — validate strictly, never
169
169
  record a guess."""
@@ -304,7 +304,7 @@ class AgenticJudgeEnv(vf.Env[AgenticJudgeEnvConfig]):
304
304
  await agents.judge.run(judge_task, runtime=box)
305
305
 
306
306
  async def finalize(self, task: vf.Task, episode: vf.Episode) -> None:
307
- by_agent = {t.agent_name: t for t in episode.traces}
307
+ by_agent = {t.agent.name: t for t in episode.traces}
308
308
  solution, verdict = by_agent["solver"], by_agent["judge"]
309
309
  data = verdict.info.get("verdict")
310
310
  if not isinstance(data, dict) or not isinstance(data.get("verdicts"), list):
@@ -89,7 +89,7 @@ class UserSimEnv(vf.Env[UserSimEnvConfig]):
89
89
  async def finalize(self, task, episode):
90
90
  """One conversation-shape fact about the user's side, recorded on the
91
91
  assistant's trace; judgement stays on the task's rewards."""
92
- (user,) = (t for t in episode.traces if t.agent_name == "user")
92
+ (user,) = (t for t in episode.traces if t.agent.name == "user")
93
93
  for trace in episode.traces:
94
- if trace.agent_name == "assistant":
94
+ if trace.agent.name == "assistant":
95
95
  trace.record_metric("user_turns", float(user.num_turns))