verifiers 0.1.15.dev413__tar.gz → 0.1.15.dev415__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 (404) hide show
  1. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/PKG-INFO +1 -1
  2. verifiers-0.1.15.dev415/verifiers/v1/cli/dashboard/base.py +108 -0
  3. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/dashboard/eval.py +87 -24
  4. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/rollout.py +10 -5
  5. verifiers-0.1.15.dev413/verifiers/v1/cli/dashboard/base.py +0 -32
  6. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/.gitignore +0 -0
  7. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/LICENSE +0 -0
  8. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/README.md +0 -0
  9. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/pyproject.toml +0 -0
  10. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/AGENTS.md +0 -0
  11. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/README.md +0 -0
  12. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/__init__.py +0 -0
  13. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/conftest.py +0 -0
  14. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_browser_env.py +0 -0
  15. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_build_script.py +0 -0
  16. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_cli_agent_env.py +0 -0
  17. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_client_auth_errors.py +0 -0
  18. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_client_config.py +0 -0
  19. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_client_multimodal_types.py +0 -0
  20. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_composable_env.py +0 -0
  21. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_context_token_metrics.py +0 -0
  22. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_decorator_ranks.py +0 -0
  23. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_endpoint_registry.py +0 -0
  24. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_env_group.py +0 -0
  25. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_env_server.py +0 -0
  26. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_environment.py +0 -0
  27. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_environment_extra.py +0 -0
  28. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_envs.py +0 -0
  29. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_error_chain.py +0 -0
  30. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_eval_display.py +0 -0
  31. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_eval_utils.py +0 -0
  32. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_gepa_cli.py +0 -0
  33. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_gepa_utils.py +0 -0
  34. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_gym_env.py +0 -0
  35. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_harbor_env_mcp.py +0 -0
  36. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_imports.py +0 -0
  37. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_init_script.py +0 -0
  38. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_install_utils.py +0 -0
  39. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_interception_utils.py +0 -0
  40. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_logging.py +0 -0
  41. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_math_rubric.py +0 -0
  42. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_maybe_think_parser.py +0 -0
  43. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_message_utils.py +0 -0
  44. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_message_utils_multimodal.py +0 -0
  45. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_multiturn_env.py +0 -0
  46. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_nemorl_client.py +0 -0
  47. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_openai_chat_completions_token_client.py +0 -0
  48. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_openai_responses_client.py +0 -0
  49. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_opencode_rlm_env.py +0 -0
  50. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_openenv_client.py +0 -0
  51. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_parser.py +0 -0
  52. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_path_utils.py +0 -0
  53. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_per_turn_timing.py +0 -0
  54. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_pricing_utils.py +0 -0
  55. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_prime_plugin.py +0 -0
  56. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_renderer_client.py +0 -0
  57. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_renderer_e2e.py +0 -0
  58. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_rlm_composable_env.py +0 -0
  59. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_rubric.py +0 -0
  60. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_rubric_group.py +0 -0
  61. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_sandbox_debug_env.py +0 -0
  62. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_sandbox_env.py +0 -0
  63. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_sandbox_mixin.py +0 -0
  64. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_save_utils.py +0 -0
  65. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_setup_script.py +0 -0
  66. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_singleturn_env.py +0 -0
  67. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_stateful_tool_env.py +0 -0
  68. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_think_parser.py +0 -0
  69. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_tool_env.py +0 -0
  70. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_tool_utils.py +0 -0
  71. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_trajectory_processing.py +0 -0
  72. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_tui_info_formatting.py +0 -0
  73. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_types.py +0 -0
  74. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_wordle_env.py +0 -0
  75. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/test_xml_parser.py +0 -0
  76. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/conftest.py +0 -0
  77. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  78. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  79. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  80. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  81. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  82. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_v0.py +0 -0
  83. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/echo_v1.py +0 -0
  84. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/pyproject.toml +0 -0
  85. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  86. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_color_codeword_tasks.py +0 -0
  87. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_configs.py +0 -0
  88. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_e2e.py +0 -0
  89. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_envs.py +0 -0
  90. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_graph.py +0 -0
  91. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_legacy.py +0 -0
  92. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/tests/v1/test_trace.py +0 -0
  93. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/AGENTS.md +0 -0
  94. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/__init__.py +0 -0
  95. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/__init__.py +0 -0
  96. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/__init__.py +0 -0
  97. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/build.py +0 -0
  98. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/eval.py +0 -0
  99. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/gepa.py +0 -0
  100. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/init.py +0 -0
  101. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/install.py +0 -0
  102. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/commands/setup.py +0 -0
  103. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/plugins/__init__.py +0 -0
  104. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/plugins/prime.py +0 -0
  105. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/cli/tui.py +0 -0
  106. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/__init__.py +0 -0
  107. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/anthropic_messages_client.py +0 -0
  108. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/client.py +0 -0
  109. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  110. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/openai_chat_completions_client.py +0 -0
  111. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  112. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/openai_completions_client.py +0 -0
  113. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/openai_responses_client.py +0 -0
  114. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/clients/renderer_client.py +0 -0
  115. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/decorators.py +0 -0
  116. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/AGENTS.md +0 -0
  117. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/__init__.py +0 -0
  118. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/env_group.py +0 -0
  119. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/environment.py +0 -0
  120. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/README.md +0 -0
  121. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/__init__.py +0 -0
  122. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  123. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/README.md +0 -0
  124. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/__init__.py +0 -0
  125. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/_filter.py +0 -0
  126. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  127. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harness.py +0 -0
  128. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  129. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  130. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  131. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  132. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  133. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  134. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  135. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/task.py +0 -0
  136. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  137. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  138. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  139. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  140. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  141. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  142. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  143. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  144. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  145. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  146. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  147. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  148. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  149. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  150. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  151. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  152. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  153. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  154. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  155. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  156. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  157. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  158. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  159. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  160. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  161. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  162. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  163. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  164. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  165. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  166. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  167. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  168. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  169. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  170. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  171. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  172. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  173. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  174. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  175. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  176. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  177. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  178. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  179. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  180. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  182. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  183. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  184. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  185. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  186. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  187. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  188. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  189. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  190. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  191. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  192. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  193. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  194. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  195. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  196. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  197. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  198. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  199. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/gym_env.py +0 -0
  200. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  201. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  202. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  203. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/mcp_env.py +0 -0
  204. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/opencode_env.py +0 -0
  205. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  206. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  207. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  208. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/utils/__init__.py +0 -0
  209. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  210. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  211. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/README.md +0 -0
  212. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/__init__.py +0 -0
  213. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/README.md +0 -0
  214. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  215. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  216. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  217. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  218. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  219. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  220. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/openenv_env.py +0 -0
  221. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  222. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/integrations/textarena_env.py +0 -0
  223. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/multiturn_env.py +0 -0
  224. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/python_env.py +0 -0
  225. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/sandbox_env.py +0 -0
  226. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/singleturn_env.py +0 -0
  227. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/stateful_tool_env.py +0 -0
  228. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/envs/tool_env.py +0 -0
  229. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/errors.py +0 -0
  230. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/gepa/__init__.py +0 -0
  231. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/gepa/adapter.py +0 -0
  232. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/gepa/config.py +0 -0
  233. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/gepa/display.py +0 -0
  234. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/gepa/gepa_utils.py +0 -0
  235. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/parsers/__init__.py +0 -0
  236. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/parsers/maybe_think_parser.py +0 -0
  237. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/parsers/parser.py +0 -0
  238. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/parsers/think_parser.py +0 -0
  239. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/parsers/xml_parser.py +0 -0
  240. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/README.md +0 -0
  241. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/__init__.py +0 -0
  242. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/inference/__init__.py +0 -0
  243. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/inference/client.py +0 -0
  244. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/inference/server.py +0 -0
  245. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/trainer/__init__.py +0 -0
  246. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/trainer/config.py +0 -0
  247. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/trainer/orchestrator.py +0 -0
  248. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/trainer/trainer.py +0 -0
  249. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rl/trainer/utils.py +0 -0
  250. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/__init__.py +0 -0
  251. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  252. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/judge_rubric.py +0 -0
  253. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/math_rubric.py +0 -0
  254. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/rubric.py +0 -0
  255. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/rubrics/rubric_group.py +0 -0
  256. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/__init__.py +0 -0
  257. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/build.py +0 -0
  258. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/eval.py +0 -0
  259. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/gepa.py +0 -0
  260. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/init.py +0 -0
  261. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/install.py +0 -0
  262. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/rl.py +0 -0
  263. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/setup.py +0 -0
  264. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/train.py +0 -0
  265. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/tui.py +0 -0
  266. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/scripts/vllm.py +0 -0
  267. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/__init__.py +0 -0
  268. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/client/env_client.py +0 -0
  269. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/client/zmq_env_client.py +0 -0
  270. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/server/__init__.py +0 -0
  271. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/server/env_router.py +0 -0
  272. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/server/env_server.py +0 -0
  273. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/server/env_worker.py +0 -0
  274. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/server/zmq_env_server.py +0 -0
  275. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/serve/types.py +0 -0
  276. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/types.py +0 -0
  277. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/__init__.py +0 -0
  278. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/async_utils.py +0 -0
  279. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/client_utils.py +0 -0
  280. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/config_utils.py +0 -0
  281. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/data_utils.py +0 -0
  282. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/display_utils.py +0 -0
  283. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/env_config_utils.py +0 -0
  284. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/env_utils.py +0 -0
  285. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/error_utils.py +0 -0
  286. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/eval_display.py +0 -0
  287. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/eval_utils.py +0 -0
  288. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/heartbeat.py +0 -0
  289. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/import_utils.py +0 -0
  290. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/install_utils.py +0 -0
  291. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/interception_utils.py +0 -0
  292. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/logging_utils.py +0 -0
  293. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/message_utils.py +0 -0
  294. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/metric_utils.py +0 -0
  295. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/path_utils.py +0 -0
  296. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/pricing_utils.py +0 -0
  297. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/process_utils.py +0 -0
  298. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/response_utils.py +0 -0
  299. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/save_utils.py +0 -0
  300. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/serve_utils.py +0 -0
  301. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/thread_utils.py +0 -0
  302. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/threaded_sandbox_client.py +0 -0
  303. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/tool_utils.py +0 -0
  304. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/usage_utils.py +0 -0
  305. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/utils/version_utils.py +0 -0
  306. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/ARCHITECTURE.md +0 -0
  307. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/GUIDE.md +0 -0
  308. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/README.md +0 -0
  309. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/__init__.py +0 -0
  310. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/__init__.py +0 -0
  311. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  312. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/dashboard/validate.py +0 -0
  313. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/eval/__init__.py +0 -0
  314. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/eval/main.py +0 -0
  315. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/eval/resume.py +0 -0
  316. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/eval/runner.py +0 -0
  317. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/init.py +0 -0
  318. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/output.py +0 -0
  319. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/resolve.py +0 -0
  320. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/serve.py +0 -0
  321. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/cli/validate.py +0 -0
  322. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/clients/__init__.py +0 -0
  323. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/clients/client.py +0 -0
  324. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/clients/config.py +0 -0
  325. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/clients/eval.py +0 -0
  326. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/clients/train.py +0 -0
  327. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/configs/__init__.py +0 -0
  328. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/configs/eval.py +0 -0
  329. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/configs/init.py +0 -0
  330. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/configs/serve.py +0 -0
  331. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/configs/validate.py +0 -0
  332. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/decorators.py +0 -0
  333. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/dialects/__init__.py +0 -0
  334. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/dialects/anthropic.py +0 -0
  335. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/dialects/base.py +0 -0
  336. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/dialects/chat.py +0 -0
  337. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/dialects/responses.py +0 -0
  338. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/env.py +0 -0
  339. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/episode.py +0 -0
  340. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/errors.py +0 -0
  341. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/graph.py +0 -0
  342. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harness.py +0 -0
  343. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/__init__.py +0 -0
  344. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  345. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/codex/harness.py +0 -0
  346. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/default/__init__.py +0 -0
  347. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/default/harness.py +0 -0
  348. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/default/program.py +0 -0
  349. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  350. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  351. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  352. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  353. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  354. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/null/__init__.py +0 -0
  355. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/null/harness.py +0 -0
  356. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/null/program.py +0 -0
  357. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  358. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  359. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  360. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  361. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  362. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/interception/__init__.py +0 -0
  363. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/interception/pool.py +0 -0
  364. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/interception/server.py +0 -0
  365. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/judge.py +0 -0
  366. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/legacy.py +0 -0
  367. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/loaders.py +0 -0
  368. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/__init__.py +0 -0
  369. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/launch.py +0 -0
  370. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/multiplex.py +0 -0
  371. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/server.py +0 -0
  372. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/toolset.py +0 -0
  373. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/mcp/user.py +0 -0
  374. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/retries.py +0 -0
  375. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/__init__.py +0 -0
  376. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/base.py +0 -0
  377. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/docker.py +0 -0
  378. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/limiters.py +0 -0
  379. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/modal.py +0 -0
  380. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/prime.py +0 -0
  381. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/runtimes/subprocess.py +0 -0
  382. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/serve/__init__.py +0 -0
  383. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/serve/client.py +0 -0
  384. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/serve/pool.py +0 -0
  385. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/serve/server.py +0 -0
  386. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/serve/types.py +0 -0
  387. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/state.py +0 -0
  388. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/task.py +0 -0
  389. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/taskset.py +0 -0
  390. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/__init__.py +0 -0
  391. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  392. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  393. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  394. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  395. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  396. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  397. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  398. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/trace.py +0 -0
  399. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/types.py +0 -0
  400. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/utils/__init__.py +0 -0
  401. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/utils/format.py +0 -0
  402. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/utils/install.py +0 -0
  403. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/verifiers/v1/utils/logging.py +0 -0
  404. {verifiers-0.1.15.dev413 → verifiers-0.1.15.dev415}/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.dev413
3
+ Version: 0.1.15.dev415
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
@@ -0,0 +1,108 @@
1
+ """The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
2
+
3
+ The eval and validate dashboards each build their own frame; `live_view` just drives whichever
4
+ `render` it's given — refreshing on a timer and drawing a final frame on exit. When given an
5
+ `on_key` handler it also reads left/right arrow presses from the terminal (see `_key_reader`).
6
+ """
7
+
8
+ import asyncio
9
+ import contextlib
10
+ import os
11
+ import sys
12
+ from collections.abc import Callable, Iterator
13
+
14
+ from rich.console import Group
15
+ from rich.live import Live
16
+
17
+ try: # POSIX-only terminal control; absent on Windows, where key reading is skipped.
18
+ import termios
19
+ import tty
20
+
21
+ _HAS_TTY = True
22
+ except ImportError:
23
+ _HAS_TTY = False
24
+
25
+ # Arrow-key escape sequences → direction, covering both the normal (`ESC [`) and application
26
+ # (`ESC O`) cursor-key modes a terminal might send.
27
+ _ARROWS = {
28
+ b"\x1b[C": "right",
29
+ b"\x1bOC": "right",
30
+ b"\x1b[D": "left",
31
+ b"\x1bOD": "left",
32
+ }
33
+
34
+
35
+ @contextlib.contextmanager
36
+ def _key_reader(
37
+ on_key: Callable[[str], None] | None, refresh: Callable[[], None]
38
+ ) -> Iterator[None]:
39
+ """Dispatch left/right arrow presses to `on_key`, redrawing immediately after each so the
40
+ view feels instant rather than waiting for the next refresh tick. A no-op unless `on_key` is
41
+ given and stdin is a real terminal. Puts stdin in cbreak mode (char-at-a-time, no echo, Ctrl+C
42
+ still interrupts) and reads it via the event loop — no extra thread — restoring the terminal on
43
+ exit."""
44
+ if on_key is None or not _HAS_TTY or not sys.stdin.isatty():
45
+ yield
46
+ return
47
+ fd = sys.stdin.fileno()
48
+ loop = asyncio.get_running_loop()
49
+ old = termios.tcgetattr(fd)
50
+ # carries a partial escape across reads — cbreak can split a key's 3 bytes over callbacks
51
+ buf = bytearray()
52
+
53
+ def _read() -> None:
54
+ try:
55
+ data = os.read(fd, 32)
56
+ except OSError:
57
+ return
58
+ if not data:
59
+ return
60
+ buf.extend(data)
61
+ fired = False
62
+ i = 0
63
+ while i < len(buf): # a chunk may hold several presses; scan the whole buffer
64
+ if key := _ARROWS.get(bytes(buf[i : i + 3])):
65
+ on_key(key)
66
+ fired = True
67
+ i += 3
68
+ elif buf[i] == 0x1B and len(buf) - i < 3:
69
+ break # incomplete escape at the tail — hold it for the next read
70
+ else:
71
+ i += 1
72
+ del buf[:i]
73
+ if fired:
74
+ refresh()
75
+
76
+ # setcbreak inside the try so the finally always restores the terminal, even if it (or
77
+ # add_reader) raises — otherwise stdin could be left in cbreak with echo off after we exit.
78
+ try:
79
+ tty.setcbreak(fd)
80
+ loop.add_reader(fd, _read)
81
+ yield
82
+ finally:
83
+ loop.remove_reader(fd)
84
+ termios.tcsetattr(fd, termios.TCSADRAIN, old)
85
+
86
+
87
+ @contextlib.asynccontextmanager
88
+ async def live_view(
89
+ render: Callable[[], Group], on_key: Callable[[str], None] | None = None
90
+ ):
91
+ """Refresh `render()` every 0.25s until the block exits, then draw one final frame. When
92
+ `on_key` is given, left/right arrow presses are dispatched to it (and redraw at once)."""
93
+ with Live(render(), auto_refresh=False) as live:
94
+
95
+ async def loop() -> None:
96
+ while True:
97
+ await asyncio.sleep(0.25)
98
+ live.update(render(), refresh=True)
99
+
100
+ task = asyncio.create_task(loop())
101
+ with _key_reader(on_key, lambda: live.update(render(), refresh=True)):
102
+ try:
103
+ yield
104
+ finally:
105
+ task.cancel()
106
+ with contextlib.suppress(asyncio.CancelledError):
107
+ await task
108
+ live.update(render(), refresh=True)
@@ -1,13 +1,14 @@
1
1
  """The eval `--rich` dashboard: a config overview, a progress bar, and one line per rollout.
2
2
 
3
3
  Reads each `Rollout.trace`/`phase` every tick — no extra plumbing. Each row carries a bracketed
4
- phase marker that reads at a glance — `[setup]` (yellow), `[rollout]` (cyan), `[finalize]`
5
- (magenta), `[scoring]` (blue), `[success]` (green), `[error]` (red) — padded so the brackets
6
- line up in a column down the left edge. The reward shows only once a rollout is fully scored
7
- (phase DONE), so it never flips as scoring lands. A task's rollouts are grouped adjacently and joined
8
- by a left brace (╭│╰), so an episode (a task's n rollouts) reads as a unit. Every started
9
- rollout stays on screen (finished ones keep their result); the overview + progress sit on top,
10
- above a rule.
4
+ phase marker that reads at a glance — `[pending]` (dim), `[setup]` (yellow), `[rollout]` (cyan),
5
+ `[finalize]` (magenta), `[scoring]` (blue), `[success]` (green), `[error]` (red) — padded so the
6
+ brackets line up in a column down the left edge. The reward shows only once a rollout is fully
7
+ scored (phase DONE), so it never flips as scoring lands. A task's rollouts are grouped adjacently
8
+ and joined by a left brace (╭│╰), so an episode (a task's n rollouts) reads as a unit. Every
9
+ rollout is on screen from the start: one still queued behind the concurrency cap reads `[pending]`
10
+ (its task is all that's known yet) until it begins, and finished ones keep their result. The
11
+ overview + progress sit on top, above a rule.
11
12
  """
12
13
 
13
14
  import contextlib
@@ -44,6 +45,7 @@ _PAGE_SECONDS = 5.0 # rotate to the next page of rollouts this often when they
44
45
  _LABEL_WIDTH = len("timeouts")
45
46
 
46
47
  _STYLE = {
48
+ "pending": "dim",
47
49
  "setup": "yellow",
48
50
  "running": "cyan",
49
51
  "finalize": "magenta",
@@ -52,6 +54,7 @@ _STYLE = {
52
54
  "error": "red",
53
55
  }
54
56
  _MARK_LABEL = {
57
+ "pending": "pending",
55
58
  "setup": "setup",
56
59
  "running": "rollout",
57
60
  "finalize": "finalize",
@@ -217,8 +220,8 @@ def Progress(
217
220
  f"{len(done)}/{len(rollouts)} · {format_time(time.time() - start)} · "
218
221
  f"reward {reward} · err {err}"
219
222
  )
220
- if page is not None: # rollouts overflow the screen — show which page is on screen
221
- stats += f" (page {page[0]}/{page[1]})"
223
+ if page is not None: # overflowing — show which page, and that the arrows page
224
+ stats += f" (page {page[0]}/{page[1]} ◄ ►)"
222
225
  row = Table.grid(expand=True, padding=(0, 1))
223
226
  row.add_column(ratio=1) # bar stretches to fill the width left of the stats
224
227
  row.add_column(justify="right", no_wrap=True)
@@ -357,17 +360,26 @@ def _tokens(trace: Trace) -> tuple[int, int, int | None, int | None, int]:
357
360
  return prompt, completion, cached, reasoning, nbranches
358
361
 
359
362
 
363
+ def _started(rollout: Rollout) -> float:
364
+ # Sort key: when a rollout began (its setup start). A still-pending rollout has no trace
365
+ # yet, so it sorts last (+inf) — behind everything already in flight, in task order.
366
+ return (
367
+ rollout.trace.timing.setup.start if rollout.trace is not None else float("inf")
368
+ )
369
+
370
+
360
371
  def _groups(rollouts: list[Rollout]) -> list[list[Rollout]]:
361
372
  # The n rollouts of each task, grouped together (so they sit adjacent); groups ordered by
362
- # earliest start, rollouts within a group by start. Finished ones stay (never removed).
373
+ # earliest start, rollouts within a group by start. Every rollout carries its `task` from
374
+ # construction, so ones still queued behind the concurrency cap (no trace yet) are grouped
375
+ # and shown too — as `[pending]`. Finished ones stay (never removed).
363
376
  by_task: dict[int, list[Rollout]] = {}
364
377
  for rollout in rollouts:
365
- if rollout.trace is not None:
366
- by_task.setdefault(rollout.trace.task.idx, []).append(rollout)
378
+ by_task.setdefault(rollout.task.idx, []).append(rollout)
367
379
  groups = list(by_task.values())
368
380
  for group in groups:
369
- group.sort(key=lambda r: r.trace.timing.setup.start)
370
- groups.sort(key=lambda g: g[0].trace.timing.setup.start)
381
+ group.sort(key=_started)
382
+ groups.sort(key=lambda g: _started(g[0]))
371
383
  return groups
372
384
 
373
385
 
@@ -385,6 +397,21 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
385
397
  for group in groups:
386
398
  for i, rollout in enumerate(group):
387
399
  t = rollout.trace
400
+ task = rollout.task
401
+ label = f"name={task.name[:32]}" if task.name else f"idx={task.idx}"
402
+ if (
403
+ t is None
404
+ ): # queued behind the concurrency cap — only its task is known yet
405
+ rows.append(
406
+ (
407
+ _brace(i, len(group)),
408
+ "pending",
409
+ [f"task {label}", *[""] * 7],
410
+ "",
411
+ "",
412
+ )
413
+ )
414
+ continue
388
415
  if rollout.phase == Phase.DONE: # fully scored — reward is final
389
416
  state = "error" if t.has_error else "success"
390
417
  result = t.error.type if t.has_error else f"reward={t.reward:.2f}"
@@ -398,7 +425,6 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
398
425
  stop = f"{stop} (truncated)".strip()
399
426
  else:
400
427
  state, result, stop = rollout.phase, "", ""
401
- label = f"name={t.task.name[:32]}" if t.task.name else f"idx={t.task.idx}"
402
428
  descriptor = (
403
429
  rollout.runtime.descriptor if rollout.runtime is not None else None
404
430
  )
@@ -469,13 +495,42 @@ def Rows(groups: list[list[Rollout]], now: float, runtime_type: str) -> Table:
469
495
  return grid
470
496
 
471
497
 
498
+ class Pager:
499
+ """Which page of overflowing rollout rows is on screen. Auto-advances on a timer until the
500
+ user takes over with the left/right arrows, after which it stays where they leave it. `count`
501
+ (the page count, set each render by `_paginate`) gates the arrows: they're inert while a single
502
+ page fits, so a stray press before rollouts overflow can't switch off auto-advance or offset the
503
+ starting page once paging begins. The chosen page is clamped to `count` (it can shrink on a
504
+ resize; it otherwise only grows, as rollouts are never removed)."""
505
+
506
+ def __init__(self) -> None:
507
+ self.page = 0
508
+ self.manual = False
509
+ self.count = 1
510
+
511
+ def on_key(self, key: str) -> None:
512
+ if key in ("left", "right") and self.count > 1:
513
+ self.manual = True
514
+ self.page += 1 if key == "right" else -1
515
+
516
+ def index(self, now: float) -> int:
517
+ # Track the auto page while it drives, so the first arrow continues from what's on screen
518
+ # rather than jumping back to page 1. Clamp in manual mode (count can shrink on resize).
519
+ if not self.manual:
520
+ self.page = int(now / _PAGE_SECONDS) % self.count
521
+ else:
522
+ self.page = max(0, min(self.page, self.count - 1))
523
+ return self.page
524
+
525
+
472
526
  def _paginate(
473
- groups: list[list[Rollout]], rows_per_page: int, now: float
527
+ groups: list[list[Rollout]], rows_per_page: int, pager: Pager, now: float
474
528
  ) -> tuple[list[list[Rollout]], int, int]:
475
529
  """Pack groups (a task's rollouts kept together) into pages of at most `rows_per_page` rows,
476
- cycling to the next page every `_PAGE_SECONDS`. Returns (this page's groups, 0-based index,
477
- page count) — a single page when everything already fits."""
530
+ selecting the one `pager` points at. Returns (this page's groups, 0-based index, page count) —
531
+ a single page when everything already fits."""
478
532
  if sum(len(g) for g in groups) <= rows_per_page:
533
+ pager.count = 1 # everything fits on one page — arrows stay inert
479
534
  return groups, 0, 1
480
535
  pages: list[list[list[Rollout]]] = []
481
536
  current: list[list[Rollout]] = []
@@ -488,20 +543,24 @@ def _paginate(
488
543
  used += len(group)
489
544
  if current:
490
545
  pages.append(current)
491
- index = int(now / _PAGE_SECONDS) % len(pages)
546
+ pager.count = len(pages)
547
+ index = pager.index(now)
492
548
  return pages[index], index, len(pages)
493
549
 
494
550
 
495
- def _render(rollouts: list[Rollout], config: EvalConfig, start: float) -> Group:
551
+ def _render(
552
+ rollouts: list[Rollout], config: EvalConfig, start: float, pager: Pager
553
+ ) -> Group:
496
554
  now = time.time()
497
555
  warning = _warning(config)
498
556
  # `{warning}\n\n{overview}` — the caution sits at the very top, blank line, then the overview.
499
557
  header = Group(warning, Text(""), Overview(config)) if warning else Overview(config)
500
558
  # Measure the fixed top (header + progress + rule) so the rollout rows fill the rest of the
501
- # screen; page through them on a timer when they'd overflow (rich would otherwise truncate).
559
+ # screen; page through them (timer, or the left/right arrows) when they'd overflow (rich would
560
+ # otherwise truncate).
502
561
  top = Group(header, Progress(rollouts, start), Rule(style="dim"))
503
562
  rows_per_page = max(1, _CONSOLE.size.height - len(_CONSOLE.render_lines(top)) - 1)
504
- page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, now)
563
+ page_groups, index, count = _paginate(_groups(rollouts), rows_per_page, pager, now)
505
564
  progress = Progress(rollouts, start, page=(index + 1, count) if count > 1 else None)
506
565
  return Group(
507
566
  header,
@@ -513,6 +572,10 @@ def _render(rollouts: list[Rollout], config: EvalConfig, start: float) -> Group:
513
572
 
514
573
  @contextlib.asynccontextmanager
515
574
  async def dashboard(rollouts: list[Rollout], config: EvalConfig, start: float):
516
- """Refresh the live eval view until the `with` block exits, then a final frame."""
517
- async with live_view(lambda: _render(rollouts, config, start)):
575
+ """Refresh the live eval view until the `with` block exits, then a final frame. Left/right
576
+ arrows page through rollout rows when they overflow the screen."""
577
+ pager = Pager()
578
+ async with live_view(
579
+ lambda: _render(rollouts, config, start, pager), on_key=pager.on_key
580
+ ):
518
581
  yield
@@ -51,9 +51,11 @@ logger = logging.getLogger(__name__)
51
51
 
52
52
 
53
53
  class Phase(StrEnum):
54
- """A rollout's lifecycle phase (for display): provisioning, the harness driving,
55
- post-run finalize, per-rollout + group scoring, then fully scored."""
54
+ """A rollout's lifecycle phase (for display): queued behind the concurrency cap,
55
+ provisioning, the harness driving, post-run finalize, per-rollout + group scoring,
56
+ then fully scored."""
56
57
 
58
+ PENDING = "pending"
57
59
  SETUP = "setup"
58
60
  RUNNING = "running"
59
61
  FINALIZE = "finalize"
@@ -93,9 +95,11 @@ class Rollout:
93
95
  `Environment.serving` context — so a rollout always has them and no runner has to thread
94
96
  them in."""
95
97
  self.interception = interception
96
- self.phase = Phase.SETUP
97
- """Lifecycle phase for display (see `Phase`); advanced through the rollout, and
98
- set to DONE by the Episode once group scoring has run."""
98
+ self.phase = Phase.PENDING
99
+ """Lifecycle phase for display (see `Phase`); starts PENDING (queued behind the
100
+ concurrency cap) so the --rich dashboard can list it before it begins, advances to
101
+ SETUP the moment `run()` starts, and is set to DONE by the Episode once group
102
+ scoring has run."""
99
103
  self.runtime: Runtime | None = None
100
104
  """The runtime, set the moment `run()` creates it (so it's always tearable-down
101
105
  even if setup crashes) and torn down in `run()`'s `finally`; the --rich dashboard
@@ -139,6 +143,7 @@ class Rollout:
139
143
  `self.shared_urls` / `self.interception`)."""
140
144
  trace: Trace = Trace(task=self.task, state=state_cls(type(self.taskset))())
141
145
  self.trace = trace # expose for the --rich dashboard
146
+ self.phase = Phase.SETUP # leaving the queue: provisioning starts now
142
147
  trace.timing.setup.start = time.time()
143
148
  self.runtime = make_runtime(
144
149
  self.runtime_config, name=trace.id
@@ -1,32 +0,0 @@
1
- """The shared dashboard engine: a rich `Live` view on a fixed refresh tick.
2
-
3
- The eval and validate dashboards each build their own frame; `live_view` just drives whichever
4
- `render` it's given — refreshing on a timer and drawing a final frame on exit.
5
- """
6
-
7
- import asyncio
8
- import contextlib
9
- from collections.abc import Callable
10
-
11
- from rich.console import Group
12
- from rich.live import Live
13
-
14
-
15
- @contextlib.asynccontextmanager
16
- async def live_view(render: Callable[[], Group]):
17
- """Refresh `render()` every 0.25s until the block exits, then draw one final frame."""
18
- with Live(render(), auto_refresh=False) as live:
19
-
20
- async def loop() -> None:
21
- while True:
22
- await asyncio.sleep(0.25)
23
- live.update(render(), refresh=True)
24
-
25
- task = asyncio.create_task(loop())
26
- try:
27
- yield
28
- finally:
29
- task.cancel()
30
- with contextlib.suppress(asyncio.CancelledError):
31
- await task
32
- live.update(render(), refresh=True)