verifiers 0.1.15.dev439__tar.gz → 0.1.15.dev441__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 (399) hide show
  1. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/__init__.py +2 -0
  3. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/graph.py +7 -0
  4. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/rollout.py +3 -0
  5. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/__init__.py +23 -4
  6. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/base.py +23 -3
  7. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/docker.py +12 -7
  8. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/modal.py +15 -12
  9. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/prime.py +29 -24
  10. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/subprocess.py +7 -5
  11. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/trace.py +7 -0
  12. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/.gitignore +0 -0
  13. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/LICENSE +0 -0
  14. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/README.md +0 -0
  15. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/pyproject.toml +0 -0
  16. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/AGENTS.md +0 -0
  17. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/__init__.py +0 -0
  18. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/conftest.py +0 -0
  19. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_browser_env.py +0 -0
  20. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_build_script.py +0 -0
  21. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_cli_agent_env.py +0 -0
  22. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_client_auth_errors.py +0 -0
  23. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_client_config.py +0 -0
  24. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_client_multimodal_types.py +0 -0
  25. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_composable_env.py +0 -0
  26. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_context_token_metrics.py +0 -0
  27. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_decorator_ranks.py +0 -0
  28. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_endpoint_registry.py +0 -0
  29. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_env_group.py +0 -0
  30. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_env_server.py +0 -0
  31. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_environment.py +0 -0
  32. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_environment_extra.py +0 -0
  33. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_envs.py +0 -0
  34. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_error_chain.py +0 -0
  35. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_eval_display.py +0 -0
  36. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_eval_utils.py +0 -0
  37. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_gepa_cli.py +0 -0
  38. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_gepa_utils.py +0 -0
  39. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_gym_env.py +0 -0
  40. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_harbor_env_mcp.py +0 -0
  41. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_imports.py +0 -0
  42. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_init_script.py +0 -0
  43. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_install_utils.py +0 -0
  44. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_interception_utils.py +0 -0
  45. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_logging.py +0 -0
  46. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_math_rubric.py +0 -0
  47. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_maybe_think_parser.py +0 -0
  48. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_message_utils.py +0 -0
  49. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_message_utils_multimodal.py +0 -0
  50. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_multiturn_env.py +0 -0
  51. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_nemorl_client.py +0 -0
  52. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_openai_chat_completions_token_client.py +0 -0
  53. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_openai_responses_client.py +0 -0
  54. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_opencode_rlm_env.py +0 -0
  55. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_openenv_client.py +0 -0
  56. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_parser.py +0 -0
  57. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_path_utils.py +0 -0
  58. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_per_turn_timing.py +0 -0
  59. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_pricing_utils.py +0 -0
  60. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_prime_plugin.py +0 -0
  61. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_renderer_client.py +0 -0
  62. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_renderer_e2e.py +0 -0
  63. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_rlm_composable_env.py +0 -0
  64. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_rubric.py +0 -0
  65. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_rubric_group.py +0 -0
  66. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_sandbox_debug_env.py +0 -0
  67. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_sandbox_env.py +0 -0
  68. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_sandbox_mixin.py +0 -0
  69. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_save_utils.py +0 -0
  70. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_setup_script.py +0 -0
  71. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_singleturn_env.py +0 -0
  72. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_stateful_tool_env.py +0 -0
  73. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_think_parser.py +0 -0
  74. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_tool_env.py +0 -0
  75. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_tool_utils.py +0 -0
  76. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_trajectory_processing.py +0 -0
  77. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_tui_info_formatting.py +0 -0
  78. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_types.py +0 -0
  79. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_wordle_env.py +0 -0
  80. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/test_xml_parser.py +0 -0
  81. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/conftest.py +0 -0
  82. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  83. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  84. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  85. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  86. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  87. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_v0.py +0 -0
  88. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/echo_v1.py +0 -0
  89. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/pyproject.toml +0 -0
  90. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  91. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_color_codeword_tasks.py +0 -0
  92. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_configs.py +0 -0
  93. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_e2e.py +0 -0
  94. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_envs.py +0 -0
  95. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_graph.py +0 -0
  96. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_judges.py +0 -0
  97. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_legacy.py +0 -0
  98. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_scoring.py +0 -0
  99. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/tests/v1/test_trace.py +0 -0
  100. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/__init__.py +0 -0
  101. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/__init__.py +0 -0
  102. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/__init__.py +0 -0
  103. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/build.py +0 -0
  104. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/eval.py +0 -0
  105. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/gepa.py +0 -0
  106. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/init.py +0 -0
  107. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/install.py +0 -0
  108. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/commands/setup.py +0 -0
  109. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/plugins/__init__.py +0 -0
  110. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/plugins/prime.py +0 -0
  111. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/cli/tui.py +0 -0
  112. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/__init__.py +0 -0
  113. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/anthropic_messages_client.py +0 -0
  114. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/client.py +0 -0
  115. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  116. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/openai_chat_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  118. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/openai_completions_client.py +0 -0
  119. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/openai_responses_client.py +0 -0
  120. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/clients/renderer_client.py +0 -0
  121. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/decorators.py +0 -0
  122. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/AGENTS.md +0 -0
  123. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/__init__.py +0 -0
  124. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/env_group.py +0 -0
  125. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/environment.py +0 -0
  126. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/README.md +0 -0
  127. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/__init__.py +0 -0
  128. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  129. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/README.md +0 -0
  130. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/__init__.py +0 -0
  131. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/_filter.py +0 -0
  132. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  133. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harness.py +0 -0
  134. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  135. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  136. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  137. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  138. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  139. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  140. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  141. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/task.py +0 -0
  142. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  143. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  144. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  145. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  146. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  147. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  148. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  149. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  150. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  151. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  152. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  153. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  154. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  155. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  156. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  157. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  158. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  159. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  160. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  161. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  162. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  163. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  164. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  165. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  166. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  167. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  168. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  169. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  170. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  171. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  172. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  173. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  174. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  175. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  176. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  177. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  178. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  179. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  180. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  181. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  182. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  183. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  185. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  186. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  187. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  188. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  189. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  190. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  191. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  192. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  193. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  194. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  195. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  196. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  197. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  198. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  199. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  200. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  201. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  202. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  203. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  204. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  205. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/gym_env.py +0 -0
  206. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  207. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  208. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  209. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/mcp_env.py +0 -0
  210. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/opencode_env.py +0 -0
  211. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  212. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  213. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  214. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/utils/__init__.py +0 -0
  215. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  216. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  217. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/README.md +0 -0
  218. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/__init__.py +0 -0
  219. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/README.md +0 -0
  220. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  221. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  222. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  223. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  224. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  225. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  226. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/openenv_env.py +0 -0
  227. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  228. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/integrations/textarena_env.py +0 -0
  229. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/multiturn_env.py +0 -0
  230. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/python_env.py +0 -0
  231. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/sandbox_env.py +0 -0
  232. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/singleturn_env.py +0 -0
  233. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/stateful_tool_env.py +0 -0
  234. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/envs/tool_env.py +0 -0
  235. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/errors.py +0 -0
  236. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/gepa/__init__.py +0 -0
  237. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/gepa/adapter.py +0 -0
  238. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/gepa/config.py +0 -0
  239. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/gepa/display.py +0 -0
  240. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/gepa/gepa_utils.py +0 -0
  241. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/parsers/__init__.py +0 -0
  242. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/parsers/maybe_think_parser.py +0 -0
  243. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/parsers/parser.py +0 -0
  244. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/parsers/think_parser.py +0 -0
  245. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/parsers/xml_parser.py +0 -0
  246. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/__init__.py +0 -0
  247. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  248. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/judge_rubric.py +0 -0
  249. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/math_rubric.py +0 -0
  250. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/rubric.py +0 -0
  251. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/rubrics/rubric_group.py +0 -0
  252. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/__init__.py +0 -0
  253. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/build.py +0 -0
  254. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/eval.py +0 -0
  255. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/gepa.py +0 -0
  256. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/init.py +0 -0
  257. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/install.py +0 -0
  258. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/setup.py +0 -0
  259. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/scripts/tui.py +0 -0
  260. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/__init__.py +0 -0
  261. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/client/env_client.py +0 -0
  262. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/client/zmq_env_client.py +0 -0
  263. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/server/__init__.py +0 -0
  264. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/server/env_router.py +0 -0
  265. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/server/env_server.py +0 -0
  266. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/server/env_worker.py +0 -0
  267. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/server/zmq_env_server.py +0 -0
  268. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/serve/types.py +0 -0
  269. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/types.py +0 -0
  270. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/__init__.py +0 -0
  271. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/async_utils.py +0 -0
  272. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/client_utils.py +0 -0
  273. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/config_utils.py +0 -0
  274. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/data_utils.py +0 -0
  275. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/display_utils.py +0 -0
  276. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/env_config_utils.py +0 -0
  277. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/env_utils.py +0 -0
  278. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/error_utils.py +0 -0
  279. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/eval_display.py +0 -0
  280. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/eval_utils.py +0 -0
  281. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/heartbeat.py +0 -0
  282. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/import_utils.py +0 -0
  283. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/install_utils.py +0 -0
  284. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/interception_utils.py +0 -0
  285. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/logging_utils.py +0 -0
  286. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/message_utils.py +0 -0
  287. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/metric_utils.py +0 -0
  288. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/path_utils.py +0 -0
  289. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/pricing_utils.py +0 -0
  290. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/process_utils.py +0 -0
  291. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/response_utils.py +0 -0
  292. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/save_utils.py +0 -0
  293. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/serve_utils.py +0 -0
  294. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/thread_utils.py +0 -0
  295. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/threaded_sandbox_client.py +0 -0
  296. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/tool_utils.py +0 -0
  297. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/usage_utils.py +0 -0
  298. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/utils/version_utils.py +0 -0
  299. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/__init__.py +0 -0
  300. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  301. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/dashboard/base.py +0 -0
  302. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/dashboard/eval.py +0 -0
  303. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/dashboard/replay.py +0 -0
  304. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/dashboard/validate.py +0 -0
  305. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/debug.py +0 -0
  306. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/eval/__init__.py +0 -0
  307. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/eval/main.py +0 -0
  308. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/eval/resume.py +0 -0
  309. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/eval/runner.py +0 -0
  310. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/init.py +0 -0
  311. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/output.py +0 -0
  312. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/replay.py +0 -0
  313. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/resolve.py +0 -0
  314. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/serve.py +0 -0
  315. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/cli/validate.py +0 -0
  316. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/clients/__init__.py +0 -0
  317. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/clients/client.py +0 -0
  318. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/clients/config.py +0 -0
  319. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/clients/eval.py +0 -0
  320. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/clients/train.py +0 -0
  321. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/__init__.py +0 -0
  322. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/debug.py +0 -0
  323. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/eval.py +0 -0
  324. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/init.py +0 -0
  325. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/replay.py +0 -0
  326. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/serve.py +0 -0
  327. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/configs/validate.py +0 -0
  328. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/decorators.py +0 -0
  329. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/dialects/__init__.py +0 -0
  330. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/dialects/anthropic.py +0 -0
  331. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/dialects/base.py +0 -0
  332. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/dialects/chat.py +0 -0
  333. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/dialects/responses.py +0 -0
  334. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/env.py +0 -0
  335. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/episode.py +0 -0
  336. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/errors.py +0 -0
  337. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harness.py +0 -0
  338. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/__init__.py +0 -0
  339. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  340. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/codex/harness.py +0 -0
  341. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/default/__init__.py +0 -0
  342. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/default/harness.py +0 -0
  343. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/default/program.py +0 -0
  344. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  345. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  346. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  347. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  348. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  349. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/null/__init__.py +0 -0
  350. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/null/harness.py +0 -0
  351. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/null/program.py +0 -0
  352. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  353. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  354. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  355. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  356. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  357. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/interception/__init__.py +0 -0
  358. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/interception/pool.py +0 -0
  359. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/interception/server.py +0 -0
  360. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judge.py +0 -0
  361. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judges/__init__.py +0 -0
  362. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judges/reference.py +0 -0
  363. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judges/reference.txt +0 -0
  364. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judges/rubric.py +0 -0
  365. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/judges/rubric.txt +0 -0
  366. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/legacy.py +0 -0
  367. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/loaders.py +0 -0
  368. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/mcp/__init__.py +0 -0
  369. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/mcp/launch.py +0 -0
  370. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/mcp/server.py +0 -0
  371. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/mcp/toolset.py +0 -0
  372. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/mcp/user.py +0 -0
  373. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/push.py +0 -0
  374. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/retries.py +0 -0
  375. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/runtimes/limiters.py +0 -0
  376. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/scoring.py +0 -0
  377. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/serve/__init__.py +0 -0
  378. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/serve/client.py +0 -0
  379. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/serve/pool.py +0 -0
  380. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/serve/server.py +0 -0
  381. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/serve/types.py +0 -0
  382. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/state.py +0 -0
  383. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/task.py +0 -0
  384. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/taskset.py +0 -0
  385. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/__init__.py +0 -0
  386. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  387. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  388. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  389. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  390. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  391. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  392. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  393. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/types.py +0 -0
  394. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/__init__.py +0 -0
  395. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/aio.py +0 -0
  396. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/format.py +0 -0
  397. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/install.py +0 -0
  398. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/logging.py +0 -0
  399. {verifiers-0.1.15.dev439 → verifiers-0.1.15.dev441}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev439
3
+ Version: 0.1.15.dev441
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
@@ -82,6 +82,7 @@ from verifiers.v1.runtimes import (
82
82
  ProgramResult,
83
83
  Runtime,
84
84
  RuntimeConfig,
85
+ RuntimeInfo,
85
86
  SubprocessConfig,
86
87
  )
87
88
  from verifiers.v1.state import State, StateT
@@ -191,6 +192,7 @@ __all__ = [
191
192
  "ModelContext",
192
193
  "Runtime",
193
194
  "RuntimeConfig",
195
+ "RuntimeInfo",
194
196
  "ProgramResult",
195
197
  "SubprocessConfig",
196
198
  "DockerConfig",
@@ -20,6 +20,7 @@ from __future__ import annotations
20
20
  import binascii
21
21
  import hashlib
22
22
  import json
23
+ import time
23
24
  from dataclasses import dataclass
24
25
  from typing import TYPE_CHECKING, Any
25
26
 
@@ -73,6 +74,12 @@ class MessageNode(StrictBaseModel):
73
74
  """True iff a model call produced this message (the response passed to `commit`); False for
74
75
  every prompt-supplied message — including assistant/tool messages fabricated as context
75
76
  the model never generated, which role alone can't tell apart from real turns."""
77
+ timestamp: float = Field(default_factory=time.time)
78
+ """Wall-clock epoch seconds when this node was created. Nodes materialize at turn commit,
79
+ so a turn's new input nodes and its assistant node carry (near-)identical stamps and the
80
+ delta between consecutive sampled nodes is that turn's harness + inference wall-clock.
81
+ Reused prefix nodes keep the stamp from the turn that first created them. Serialized, so
82
+ a dump re-validated from wire/disk keeps the original times."""
76
83
  token_ids: list[int] = Field(default_factory=list)
77
84
  """This message's delta contribution to the cumulative token sequence: its leading
78
85
  template scaffold + its own tokens — for an assistant, the generation-prompt scaffold
@@ -149,6 +149,9 @@ class Rollout:
149
149
  self.runtime_config, name=trace.id
150
150
  ) # ref set first → always tearable-down; named after the rollout for traceability
151
151
  runtime = self.runtime
152
+ # The live info object, shared by reference: the trace carries the full runtime config
153
+ # from the start, and the resource `id` lands on it the moment start() provisions.
154
+ trace.runtime = runtime.info
152
155
  ctx = self.ctx
153
156
  stops = discover_decorated(self.taskset, "stop")
154
157
  logger.info(
@@ -13,22 +13,35 @@ from pydantic import Field
13
13
 
14
14
  from verifiers.v1.runtimes.base import (
15
15
  HOST,
16
+ BaseRuntimeInfo,
16
17
  ProgramResult,
17
18
  Runtime,
18
19
  host_endpoint,
19
20
  reachable_url,
20
21
  register,
21
22
  )
22
- from verifiers.v1.runtimes.docker import DockerConfig, DockerRuntime
23
- from verifiers.v1.runtimes.modal import ModalConfig, ModalRuntime
24
- from verifiers.v1.runtimes.prime import PrimeConfig, PrimeRuntime
25
- from verifiers.v1.runtimes.subprocess import SubprocessConfig, SubprocessRuntime
23
+ from verifiers.v1.runtimes.docker import DockerConfig, DockerRuntime, DockerRuntimeInfo
24
+ from verifiers.v1.runtimes.modal import ModalConfig, ModalRuntime, ModalRuntimeInfo
25
+ from verifiers.v1.runtimes.prime import PrimeConfig, PrimeRuntime, PrimeRuntimeInfo
26
+ from verifiers.v1.runtimes.subprocess import (
27
+ SubprocessConfig,
28
+ SubprocessRuntime,
29
+ SubprocessRuntimeInfo,
30
+ )
26
31
 
27
32
  RuntimeConfig = Annotated[
28
33
  SubprocessConfig | DockerConfig | PrimeConfig | ModalConfig,
29
34
  Field(discriminator="type"),
30
35
  ]
31
36
 
37
+ RuntimeInfo = Annotated[
38
+ SubprocessRuntimeInfo | DockerRuntimeInfo | PrimeRuntimeInfo | ModalRuntimeInfo,
39
+ Field(discriminator="type"),
40
+ ]
41
+ """What a rollout's runtime looked like, as trace data: each runtime's info type is its full
42
+ config plus the provisioned resource's `id` (see `BaseRuntimeInfo`). The discriminated union
43
+ is `Trace.runtime`'s type, so a dumped trace round-trips to the exact info class."""
44
+
32
45
 
33
46
  def _runtime_cls(config: RuntimeConfig) -> type[Runtime]:
34
47
  if isinstance(config, PrimeConfig):
@@ -58,6 +71,8 @@ __all__ = [
58
71
  "ProgramResult",
59
72
  "Runtime",
60
73
  "RuntimeConfig",
74
+ "RuntimeInfo",
75
+ "BaseRuntimeInfo",
61
76
  "make_runtime",
62
77
  "runtime_is_local",
63
78
  "host_endpoint",
@@ -65,10 +80,14 @@ __all__ = [
65
80
  "HOST",
66
81
  "SubprocessConfig",
67
82
  "SubprocessRuntime",
83
+ "SubprocessRuntimeInfo",
68
84
  "DockerConfig",
69
85
  "DockerRuntime",
86
+ "DockerRuntimeInfo",
70
87
  "PrimeConfig",
71
88
  "PrimeRuntime",
89
+ "PrimeRuntimeInfo",
72
90
  "ModalConfig",
73
91
  "ModalRuntime",
92
+ "ModalRuntimeInfo",
74
93
  ]
@@ -19,6 +19,8 @@ from dataclasses import dataclass
19
19
  from pathlib import PurePosixPath
20
20
  from typing import ClassVar, TypeVar
21
21
 
22
+ from pydantic_config import BaseConfig
23
+
22
24
  from verifiers.v1.retries import retrying
23
25
  from verifiers.v1.utils.aio import run_shielded
24
26
 
@@ -106,6 +108,19 @@ def cleanup_at_exit() -> None:
106
108
  runtime.cleanup()
107
109
 
108
110
 
111
+ class BaseRuntimeInfo(BaseConfig):
112
+ """Runtime metadata persisted with the rollout (`Trace.runtime`): each runtime's info class
113
+ inherits its full config — every knob the runtime ran with — and adds the provisioned
114
+ resource's `id`. Built with the runtime and shared by reference with the trace, so fields
115
+ land there the moment they're known: the config at creation, `id` once `start()` has
116
+ provisioned the resource. `RuntimeInfo` (the discriminated union over the concrete info
117
+ types) is what a dumped trace round-trips through."""
118
+
119
+ id: str | None = None
120
+ """The provisioned resource's identifier (None until the runtime is up): the subprocess
121
+ workdir, the docker container id, the prime/modal sandbox id."""
122
+
123
+
109
124
  class Runtime(ABC):
110
125
  is_local: ClassVar[bool] = True
111
126
  """Whether this runtime shares the host network — a program inside it reaches a host service
@@ -113,6 +128,11 @@ class Runtime(ABC):
113
128
  subprocess / docker(--network host); remote runtimes (modal/prime) override to False (they
114
129
  need a tunnel each way: `host_endpoint` inward, `expose` outward)."""
115
130
 
131
+ info: BaseRuntimeInfo
132
+ """This runtime's trace-facing metadata (see `BaseRuntimeInfo`): the full config plus the
133
+ resolved resource `id`. Each runtime constructs its own info type in `__init__` and fills
134
+ `id` in `start()`."""
135
+
116
136
  def __init__(self, name: str | None = None) -> None:
117
137
  self.name = name or f"vf-{uuid.uuid4().hex[:12]}"
118
138
  """Resource name — the subprocess workdir, docker `--name`, prime sandbox name.
@@ -131,9 +151,9 @@ class Runtime(ABC):
131
151
 
132
152
  @property
133
153
  def descriptor(self) -> str | None:
134
- """A short resolved id for display (None until provisioned). Overridden per
135
- runtime: subprocess workdir, docker image, prime sandbox id."""
136
- return None
154
+ """A short resolved id for display (None until provisioned): the runtime's `info.id`
155
+ subprocess workdir, docker container id, prime/modal sandbox id."""
156
+ return self.info.id
137
157
 
138
158
  # --- lifecycle ---
139
159
 
@@ -15,7 +15,12 @@ from typing import Literal
15
15
  from pydantic_config import BaseConfig
16
16
 
17
17
  from verifiers.v1.errors import SandboxError
18
- from verifiers.v1.runtimes.base import ProgramResult, Runtime, parse_gpu
18
+ from verifiers.v1.runtimes.base import (
19
+ BaseRuntimeInfo,
20
+ ProgramResult,
21
+ Runtime,
22
+ parse_gpu,
23
+ )
19
24
 
20
25
  logger = logging.getLogger(__name__)
21
26
 
@@ -37,6 +42,10 @@ class DockerConfig(BaseConfig):
37
42
  this is accepted (so a task can declare it without a warning) but not enforced."""
38
43
 
39
44
 
45
+ class DockerRuntimeInfo(DockerConfig, BaseRuntimeInfo):
46
+ """`DockerConfig` + the resolved `id` — docker's short container id."""
47
+
48
+
40
49
  async def docker(*args: str) -> ProgramResult:
41
50
  """Run a `docker` CLI command, capturing its result."""
42
51
  proc = await asyncio.create_subprocess_exec(
@@ -59,14 +68,10 @@ class DockerRuntime(Runtime):
59
68
  def __init__(self, config: DockerConfig, name: str | None = None) -> None:
60
69
  super().__init__(name)
61
70
  self.config = config
71
+ self.info = DockerRuntimeInfo(**config.model_dump())
62
72
  self._container: str | None = None # our `--name` (used for exec/rm)
63
- self._container_id: str | None = None # docker's short id (for display)
64
73
  self._stopped = False
65
74
 
66
- @property
67
- def descriptor(self) -> str | None:
68
- return self._container_id
69
-
70
75
  async def start(self) -> None:
71
76
  try:
72
77
  version = await docker("version", "--format", "{{.Server.Version}}")
@@ -111,7 +116,7 @@ class DockerRuntime(Runtime):
111
116
  )
112
117
  if run.exit_code != 0:
113
118
  raise SandboxError(f"docker run failed: {run.stderr.strip()}")
114
- self._container_id = run.stdout.strip()[
119
+ self.info.id = run.stdout.strip()[
115
120
  :12
116
121
  ] # `docker run -d` prints the container id
117
122
  logger.info(
@@ -17,7 +17,12 @@ from typing import ClassVar, Literal
17
17
  from pydantic_config import BaseConfig
18
18
 
19
19
  from verifiers.v1.errors import SandboxError
20
- from verifiers.v1.runtimes.base import SERVICE_PORT, ProgramResult, Runtime
20
+ from verifiers.v1.runtimes.base import (
21
+ SERVICE_PORT,
22
+ BaseRuntimeInfo,
23
+ ProgramResult,
24
+ Runtime,
25
+ )
21
26
  from verifiers.v1.runtimes.limiters import creation_limiter
22
27
 
23
28
  logger = logging.getLogger(__name__)
@@ -50,6 +55,10 @@ class ModalConfig(BaseConfig):
50
55
  env-server worker process (None/<= 0 disables it)."""
51
56
 
52
57
 
58
+ class ModalRuntimeInfo(ModalConfig, BaseRuntimeInfo):
59
+ """`ModalConfig` + the resolved `id` — the modal sandbox object id."""
60
+
61
+
53
62
  class ModalRuntime(Runtime):
54
63
  """Runs the program in a Modal sandbox; the server is reached via a tunnel."""
55
64
 
@@ -58,12 +67,8 @@ class ModalRuntime(Runtime):
58
67
  def __init__(self, config: ModalConfig, name: str | None = None) -> None:
59
68
  super().__init__(name)
60
69
  self.config = config
70
+ self.info = ModalRuntimeInfo(**config.model_dump())
61
71
  self._sandbox = None
62
- self._sandbox_id: str | None = None
63
-
64
- @property
65
- def descriptor(self) -> str | None:
66
- return self._sandbox_id
67
72
 
68
73
  @property
69
74
  def published_port(self) -> int | None:
@@ -101,9 +106,9 @@ class ModalRuntime(Runtime):
101
106
  timeout=24 * 60 * 60, # Maximum lifetime of any sandbox.
102
107
  encrypted_ports=[SERVICE_PORT],
103
108
  )
104
- self._sandbox_id = self._sandbox.object_id
109
+ self.info.id = self._sandbox.object_id
105
110
  logger.info(
106
- "modal: sandbox %s up (image=%s)", self._sandbox_id, self.config.image
111
+ "modal: sandbox %s up (image=%s)", self.info.id, self.config.image
107
112
  )
108
113
  await self._sandbox.filesystem.make_directory.aio(self.config.workdir)
109
114
  except (
@@ -185,7 +190,7 @@ class ModalRuntime(Runtime):
185
190
  # the sandbox via Modal's sync API so the costly resource isn't left to its max-lifetime.
186
191
  # Idempotent — the async `stop` handles the normal path, and a second terminate is a no-op.
187
192
  sandbox, self._sandbox = self._sandbox, None
188
- if sandbox is not None: # `_sandbox_id` kept so descriptor survives teardown
193
+ if sandbox is not None: # `info.id` kept so descriptor survives teardown
189
194
  with contextlib.suppress(Exception):
190
195
  sandbox.terminate()
191
196
 
@@ -202,7 +207,5 @@ class ModalRuntime(Runtime):
202
207
  try:
203
208
  await sandbox.terminate.aio()
204
209
  except Exception as e:
205
- logger.warning(
206
- "modal: failed to terminate sandbox %s: %s", self._sandbox_id, e
207
- )
210
+ logger.warning("modal: failed to terminate sandbox %s: %s", self.info.id, e)
208
211
  self._sandbox = None
@@ -19,7 +19,13 @@ from pydantic import model_validator
19
19
  from pydantic_config import BaseConfig
20
20
 
21
21
  from verifiers.v1.errors import SandboxError
22
- from verifiers.v1.runtimes.base import SERVICE_PORT, ProgramResult, Runtime, parse_gpu
22
+ from verifiers.v1.runtimes.base import (
23
+ SERVICE_PORT,
24
+ BaseRuntimeInfo,
25
+ ProgramResult,
26
+ Runtime,
27
+ parse_gpu,
28
+ )
23
29
  from verifiers.v1.runtimes.limiters import creation_limiter
24
30
 
25
31
  logger = logging.getLogger(__name__)
@@ -69,6 +75,10 @@ class PrimeConfig(BaseConfig):
69
75
  return self
70
76
 
71
77
 
78
+ class PrimeRuntimeInfo(PrimeConfig, BaseRuntimeInfo):
79
+ """`PrimeConfig` + the resolved `id` — the prime sandbox id."""
80
+
81
+
72
82
  class PrimeRuntime(Runtime):
73
83
  """Runs the program in a Prime sandbox; the server is reached via a tunnel."""
74
84
 
@@ -77,12 +87,8 @@ class PrimeRuntime(Runtime):
77
87
  def __init__(self, config: PrimeConfig, name: str | None = None) -> None:
78
88
  super().__init__(name)
79
89
  self.config = config
90
+ self.info = PrimeRuntimeInfo(**config.model_dump())
80
91
  self._client = None
81
- self._sandbox_id: str | None = None
82
-
83
- @property
84
- def descriptor(self) -> str | None:
85
- return self._sandbox_id
86
92
 
87
93
  @property
88
94
  def published_port(self) -> int | None:
@@ -96,10 +102,11 @@ class PrimeRuntime(Runtime):
96
102
  # GB). gpu_type/region are only sent when set (else provider-chosen).
97
103
  gpu_type, gpu_count = parse_gpu(self.config.gpu)
98
104
  # prime's idle timeout is in whole minutes; convert from the seconds config surface
99
- # (floored to the SDK's 1-minute minimum).
105
+ # (floored to the SDK's 1-minute minimum). VM sandboxes don't support an idle timeout
106
+ # (the API 422s on it), so it's dropped there rather than failing every VM rollout.
100
107
  idle_minutes = (
101
108
  max(1, math.ceil(self.config.idle_timeout / 60))
102
- if self.config.idle_timeout is not None
109
+ if self.config.idle_timeout is not None and not self.config.vm
103
110
  else None
104
111
  )
105
112
  options = {
@@ -130,13 +137,13 @@ class PrimeRuntime(Runtime):
130
137
  **{k: v for k, v in options.items() if v is not None},
131
138
  )
132
139
  )
133
- self._sandbox_id = sandbox.id
134
- await self._client.wait_for_creation(self._sandbox_id)
140
+ self.info.id = sandbox.id
141
+ await self._client.wait_for_creation(self.info.id)
135
142
  logger.info(
136
- "prime: sandbox %s up (image=%s)", self._sandbox_id, self.config.image
143
+ "prime: sandbox %s up (image=%s)", self.info.id, self.config.image
137
144
  )
138
145
  await self._client.run_background_job(
139
- self._sandbox_id, f"mkdir -p {shlex.quote(self.config.workdir)}"
146
+ self.info.id, f"mkdir -p {shlex.quote(self.config.workdir)}"
140
147
  )
141
148
  except (
142
149
  Exception
@@ -148,14 +155,14 @@ class PrimeRuntime(Runtime):
148
155
  # Poll directly so the rollout stage owns the execution timeout; the SDK helper
149
156
  # otherwise imposes its own 15-minute limit.
150
157
  job = await self._client.start_background_job(
151
- self._sandbox_id,
158
+ self.info.id,
152
159
  shlex.join(argv),
153
160
  working_dir=self.config.workdir,
154
161
  env=env,
155
162
  )
156
163
  delay = 0.1
157
164
  while True:
158
- result = await self._client.get_background_job(self._sandbox_id, job)
165
+ result = await self._client.get_background_job(self.info.id, job)
159
166
  if result.completed:
160
167
  break
161
168
  await asyncio.sleep(delay)
@@ -177,7 +184,7 @@ class PrimeRuntime(Runtime):
177
184
  # backend default, which lands in us-central) 400 it; `us` supports it. TODO: re-enable the
178
185
  # prime cases in the e2e `skip_if_unexposable` guard once prime exposes ports in any region.
179
186
  try:
180
- exposed = await self._client.expose(self._sandbox_id, port)
187
+ exposed = await self._client.expose(self.info.id, port)
181
188
  except Exception as e: # surface prime's exposure constraints actionably
182
189
  raise SandboxError(
183
190
  "prime port exposure failed — port exposure isn't supported in this sandbox's "
@@ -210,9 +217,7 @@ class PrimeRuntime(Runtime):
210
217
  try:
211
218
  with tempfile.TemporaryDirectory() as directory:
212
219
  download = Path(directory) / "download"
213
- await self._client.download_file(
214
- self._sandbox_id, target, str(download)
215
- )
220
+ await self._client.download_file(self.info.id, target, str(download))
216
221
  return await asyncio.to_thread(download.read_bytes)
217
222
  except Exception as e:
218
223
  raise SandboxError(f"read {path!r}: {e}") from e
@@ -234,7 +239,7 @@ class PrimeRuntime(Runtime):
234
239
  )
235
240
  try:
236
241
  await self._client.upload_bytes(
237
- self._sandbox_id, target, data, filename=PurePosixPath(target).name
242
+ self.info.id, target, data, filename=PurePosixPath(target).name
238
243
  )
239
244
  except Exception as e:
240
245
  raise SandboxError(f"write {path!r}: {e}") from e
@@ -243,12 +248,12 @@ class PrimeRuntime(Runtime):
243
248
  # Synchronous atexit backstop (the async client can't run once the loop is gone): delete
244
249
  # the sandbox via the sync client, so the costly resource isn't left to its max-lifetime.
245
250
  # Idempotent — the async `stop` deletes it on the normal path, a second delete 404s.
246
- if self._sandbox_id is not None:
251
+ if self.info.id is not None:
247
252
  from prime_sandboxes import SandboxClient
248
253
  from prime_sandboxes.core import APIClient
249
254
 
250
255
  with contextlib.suppress(Exception):
251
- SandboxClient(APIClient()).delete(self._sandbox_id)
256
+ SandboxClient(APIClient()).delete(self.info.id)
252
257
 
253
258
  async def teardown(self) -> None:
254
259
  # Best-effort, idempotent teardown: delete the sandbox (the costly resource). Runs via
@@ -257,13 +262,13 @@ class PrimeRuntime(Runtime):
257
262
  if client is None:
258
263
  return
259
264
  if (
260
- self._sandbox_id is not None
265
+ self.info.id is not None
261
266
  ): # kept (not nulled) so descriptor survives teardown
262
267
  try:
263
- await client.delete(self._sandbox_id)
268
+ await client.delete(self.info.id)
264
269
  except Exception as e:
265
270
  logger.warning(
266
- "prime: failed to delete sandbox %s: %s", self._sandbox_id, e
271
+ "prime: failed to delete sandbox %s: %s", self.info.id, e
267
272
  )
268
273
  with contextlib.suppress(Exception):
269
274
  await client.aclose()
@@ -15,7 +15,7 @@ from typing import Literal
15
15
 
16
16
  from pydantic_config import BaseConfig
17
17
 
18
- from verifiers.v1.runtimes.base import ProgramResult, Runtime
18
+ from verifiers.v1.runtimes.base import BaseRuntimeInfo, ProgramResult, Runtime
19
19
 
20
20
  # A local subprocess inherits the host environment EXCEPT any var whose name
21
21
  # contains "API_KEY" — so it can never reach a real provider with the host's API
@@ -33,6 +33,10 @@ class SubprocessConfig(BaseConfig):
33
33
  type: Literal["subprocess"] = "subprocess"
34
34
 
35
35
 
36
+ class SubprocessRuntimeInfo(SubprocessConfig, BaseRuntimeInfo):
37
+ """`SubprocessConfig` + the resolved `id` — the `/tmp/<name>` workspace path."""
38
+
39
+
36
40
  class SubprocessRuntime(Runtime):
37
41
  """Runs the program as a local subprocess in a unique /tmp workspace."""
38
42
 
@@ -45,16 +49,14 @@ class SubprocessRuntime(Runtime):
45
49
  self._uv_interpreters = self._interpreters
46
50
  self._uv_script_locks = self._locks
47
51
  self.config = config
52
+ self.info = SubprocessRuntimeInfo(**config.model_dump())
48
53
  self.workdir: Path | None = None
49
54
  self._background: list[asyncio.subprocess.Process] = []
50
55
 
51
- @property
52
- def descriptor(self) -> str | None:
53
- return self.workdir.name if self.workdir else None
54
-
55
56
  async def start(self) -> None:
56
57
  self.workdir = Path("/tmp") / self.name
57
58
  self.workdir.mkdir()
59
+ self.info.id = str(self.workdir)
58
60
 
59
61
  async def run(self, argv: list[str], env: dict[str, str]) -> ProgramResult:
60
62
  full_env = {k: v for k, v in os.environ.items() if "API_KEY" not in k.upper()}
@@ -25,6 +25,7 @@ if TYPE_CHECKING:
25
25
  from verifiers.v1 import graph
26
26
  from verifiers.v1.errors import ProviderError
27
27
  from verifiers.v1.graph import MessageNode
28
+ from verifiers.v1.runtimes import RuntimeInfo
28
29
  from verifiers.v1.state import State, StateT
29
30
  from verifiers.v1.task import TaskT, WireTask
30
31
  from verifiers.v1.types import (
@@ -220,6 +221,12 @@ class Trace(StrictBaseModel, Generic[TaskT, StateT]):
220
221
  """Unique id for this rollout, auto-generated per trace."""
221
222
  task: TaskT
222
223
  """The (immutable) task being solved — fully typed, flows into scoring."""
224
+ runtime: RuntimeInfo | None = None
225
+ """Where the rollout ran: the runtime's full config plus the provisioned resource's `id`
226
+ (subprocess workdir / docker container id / prime or modal sandbox id). The rollout assigns
227
+ the live runtime's `info` object the moment it makes the runtime, so the config is recorded
228
+ from the start and `id` appears as soon as the runtime is up. None only for traces created
229
+ outside a rollout."""
223
230
  nodes: list[MessageNode] = Field(default_factory=list)
224
231
  """The message graph — one node per distinct message, linked to its predecessor (see
225
232
  `graph`). The ground truth; `branches` is a view over it. Stores each message once, so