benchflow 0.6.7.dev1839__tar.gz → 0.6.7.dev1841__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 (705) hide show
  1. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/PKG-INFO +1 -1
  2. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/pyproject.toml +1 -1
  3. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/live_activity.py +4 -1
  4. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/session.py +55 -9
  5. benchflow-0.6.7.dev1841/src/benchflow/cli/_failure_evidence.py +167 -0
  6. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_live_progress.py +55 -15
  7. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_shared.py +24 -13
  8. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/__init__.py +6 -2
  9. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_live_progress.py +297 -92
  10. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_console_progress.py +50 -0
  11. benchflow-0.6.7.dev1839/src/benchflow/cli/_failure_evidence.py +0 -122
  12. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/.gitignore +0 -0
  13. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/CHANGELOG.md +0 -0
  14. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/LICENSE +0 -0
  15. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/README.md +0 -0
  16. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/__init__.py +0 -0
  17. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_dotenv.py +0 -0
  18. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_paths.py +0 -0
  19. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_run.py +0 -0
  20. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_types.py +0 -0
  21. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/__init__.py +0 -0
  22. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/benchmark_repos.py +0 -0
  23. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/build_context_stage.py +0 -0
  24. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/config.py +0 -0
  25. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/config_override.py +0 -0
  26. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/content_address.py +0 -0
  27. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/dataset_registry.py +0 -0
  28. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/env_registry.py +0 -0
  29. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/evaluation_results.py +0 -0
  30. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/hf_datasets.py +0 -0
  31. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/json_safe.py +0 -0
  32. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/learner_memory.py +0 -0
  33. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/result_metadata.py +0 -0
  34. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/reward_events.py +0 -0
  35. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/scoring.py +0 -0
  36. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/source_provenance.py +0 -0
  37. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
  38. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
  39. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
  40. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
  41. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
  42. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/text.py +0 -0
  43. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/yaml_loader.py +0 -0
  44. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/__init__.py +0 -0
  45. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/client.py +0 -0
  46. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/container_transport.py +0 -0
  47. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/runtime.py +0 -0
  48. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/selection.py +0 -0
  49. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/transport.py +0 -0
  50. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/acp/types.py +0 -0
  51. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/__init__.py +0 -0
  52. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon.py +0 -0
  53. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_container.py +0 -0
  54. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
  55. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
  56. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_services.py +0 -0
  57. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/harbor.py +0 -0
  58. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/inbound.py +0 -0
  59. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/inspect_ai.py +0 -0
  60. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/ors.py +0 -0
  61. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/__init__.py +0 -0
  62. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
  63. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
  64. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/source.py +0 -0
  65. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router.py +0 -0
  66. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_guide.py +0 -0
  67. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_parity.py +0 -0
  68. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_scaffold.py +0 -0
  69. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/__init__.py +0 -0
  70. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/codex_config.py +0 -0
  71. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/credentials.py +0 -0
  72. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
  73. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/env.py +0 -0
  74. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/errors.py +0 -0
  75. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
  76. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/install.py +0 -0
  77. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/manifest.py +0 -0
  78. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
  79. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/pi_acp_launcher.py +0 -0
  80. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/protocol.py +0 -0
  81. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/providers.py +0 -0
  82. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/registry.py +0 -0
  83. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/agents/remote_manifests.py +0 -0
  84. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/branch.py +0 -0
  85. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/__init__.py +0 -0
  86. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_hosted_env.py +0 -0
  87. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_options.py +0 -0
  88. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/adopt.py +0 -0
  89. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/agent.py +0 -0
  90. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/continue_cmd.py +0 -0
  91. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/environment.py +0 -0
  92. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/eval_artifacts.py +0 -0
  93. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/eval_lift.py +0 -0
  94. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/hub.py +0 -0
  95. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/main.py +0 -0
  96. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/monitor.py +0 -0
  97. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/review.py +0 -0
  98. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/sandbox.py +0 -0
  99. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/skills.py +0 -0
  100. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/tasks.py +0 -0
  101. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/trace_import.py +0 -0
  102. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/cli/train.py +0 -0
  103. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/__init__.py +0 -0
  104. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/batch.py +0 -0
  105. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/orchestrator.py +0 -0
  106. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/replay_proxy.py +0 -0
  107. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/run_folder.py +0 -0
  108. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
  109. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/__init__.py +0 -0
  110. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/planes.py +0 -0
  111. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/user.py +0 -0
  112. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/environment/Dockerfile +0 -0
  113. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/instruction.md +0 -0
  114. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/task.md +0 -0
  115. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/task.toml +0 -0
  116. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/tests/test.sh +0 -0
  117. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/diagnostics.py +0 -0
  118. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/__init__.py +0 -0
  119. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
  120. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
  121. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/manifest.py +0 -0
  122. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/manifest_env.py +0 -0
  123. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/protocol.py +0 -0
  124. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/environment/readiness.py +0 -0
  125. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/eval_artifacts.py +0 -0
  126. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/eval_lift.py +0 -0
  127. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/eval_plan.py +0 -0
  128. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/eval_sharding.py +0 -0
  129. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/eval_worker.py +0 -0
  130. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/evaluation.py +0 -0
  131. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/__init__.py +0 -0
  132. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/__init__.py +0 -0
  133. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/hooks.py +0 -0
  134. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
  135. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/hosted_env.py +0 -0
  136. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/hub/__init__.py +0 -0
  137. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/hub/harbor_registry.py +0 -0
  138. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/__init__.py +0 -0
  139. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/trl/__init__.py +0 -0
  140. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/trl/spec.py +0 -0
  141. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/learner_skills.py +0 -0
  142. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/learner_store.py +0 -0
  143. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/loop_strategies.py +0 -0
  144. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/loop_sweep.py +0 -0
  145. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/metrics.py +0 -0
  146. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/models.py +0 -0
  147. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/monitor.py +0 -0
  148. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/__init__.py +0 -0
  149. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
  150. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
  151. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_config.py +0 -0
  152. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_logging.py +0 -0
  153. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_runtime.py +0 -0
  154. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/providers/runtime.py +0 -0
  155. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/publish/__init__.py +0 -0
  156. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/publish/huggingface.py +0 -0
  157. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/py.typed +0 -0
  158. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/__init__.py +0 -0
  159. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/config.py +0 -0
  160. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/default-rubric.json +0 -0
  161. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/prompts.py +0 -0
  162. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/runner.py +0 -0
  163. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/review/wrapper.py +0 -0
  164. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/README.md +0 -0
  165. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/__init__.py +0 -0
  166. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/builtins.py +0 -0
  167. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/events.py +0 -0
  168. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/file_readers.py +0 -0
  169. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/llm.py +0 -0
  170. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/memory_scorer.py +0 -0
  171. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/node.py +0 -0
  172. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/protocol.py +0 -0
  173. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/rubric.py +0 -0
  174. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/rubric_config.py +0 -0
  175. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/validation.py +0 -0
  176. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_config.py +0 -0
  177. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_deadline.py +0 -0
  178. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_results.py +0 -0
  179. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_setup.py +0 -0
  180. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_skills.py +0 -0
  181. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_usage.py +0 -0
  182. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_user_loop.py +0 -0
  183. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/session_factory_runtime.py +0 -0
  184. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/task_runtime.py +0 -0
  185. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout_branch.py +0 -0
  186. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/rollout_planes.py +0 -0
  187. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/runtime.py +0 -0
  188. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/__init__.py +0 -0
  189. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_base.py +0 -0
  190. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
  191. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose.py +0 -0
  192. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
  193. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
  194. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
  195. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
  196. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_sdk_ops.py +0 -0
  197. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore.py +0 -0
  198. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_builder.py +0 -0
  199. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_image.py +0 -0
  200. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
  201. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
  202. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
  203. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/apple_container.py +0 -0
  204. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona.py +0 -0
  205. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_dind.py +0 -0
  206. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_pty.py +0 -0
  207. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_reaper.py +0 -0
  208. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_strategies.py +0 -0
  209. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/docker.py +0 -0
  210. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/lockdown.py +0 -0
  211. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/metadata.py +0 -0
  212. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/modal_impl.py +0 -0
  213. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/__init__.py +0 -0
  214. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/_base.py +0 -0
  215. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/agentcore.py +0 -0
  216. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/apple.py +0 -0
  217. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/daytona.py +0 -0
  218. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/docker.py +0 -0
  219. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/protocol.py +0 -0
  220. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/providers.py +0 -0
  221. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/services.py +0 -0
  222. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/setup.py +0 -0
  223. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/snapshot.py +0 -0
  224. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/user.py +0 -0
  225. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/scenes.py +0 -0
  226. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/sdk.py +0 -0
  227. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/self_gen.py +0 -0
  228. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/__init__.py +0 -0
  229. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/_core.py +0 -0
  230. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/gepa_export.py +0 -0
  231. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/schema.py +0 -0
  232. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skill_policy.py +0 -0
  233. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/skills.py +0 -0
  234. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/__init__.py +0 -0
  235. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_evidence.py +0 -0
  236. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_normalize.py +0 -0
  237. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_parse.py +0 -0
  238. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_profiles.py +0 -0
  239. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live.py +0 -0
  240. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_model.py +0 -0
  241. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_report.py +0 -0
  242. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_validation.py +0 -0
  243. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/config.py +0 -0
  244. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/discovery.py +0 -0
  245. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/document.py +0 -0
  246. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/env.py +0 -0
  247. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/export.py +0 -0
  248. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/imports.py +0 -0
  249. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/output_format.py +0 -0
  250. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/package.py +0 -0
  251. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/paths.py +0 -0
  252. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/prompts.py +0 -0
  253. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/runtime_capabilities.py +0 -0
  254. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/runtime_view.py +0 -0
  255. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/task.py +0 -0
  256. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier.py +0 -0
  257. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_core.py +0 -0
  258. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_document.py +0 -0
  259. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_errors.py +0 -0
  260. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_judge_inputs.py +0 -0
  261. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_ors_episode.py +0 -0
  262. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_reward_kit.py +0 -0
  263. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_scan.py +0 -0
  264. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_script_strategy.py +0 -0
  265. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/templates/__init__.py +0 -0
  266. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/templates/judge.py.tmpl +0 -0
  267. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/templates/test.sh.tmpl +0 -0
  268. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/__init__.py +0 -0
  269. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/huggingface.py +0 -0
  270. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/local.py +0 -0
  271. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/models.py +0 -0
  272. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/parsers.py +0 -0
  273. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/traces/task_gen.py +0 -0
  274. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/training/__init__.py +0 -0
  275. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/training/backends/__init__.py +0 -0
  276. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/training/backends/prime_rl.py +0 -0
  277. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/training/run_manifest.py +0 -0
  278. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/__init__.py +0 -0
  279. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_capture.py +0 -0
  280. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_export_common.py +0 -0
  281. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_llm_capture.py +0 -0
  282. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/call_purpose.py +0 -0
  283. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export.py +0 -0
  284. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_adp.py +0 -0
  285. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_atif.py +0 -0
  286. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_prime_sft.py +0 -0
  287. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_trl_sft.py +0 -0
  288. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/metrics.py +0 -0
  289. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/results.py +0 -0
  290. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/tree.py +0 -0
  291. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
  292. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/types.py +0 -0
  293. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/viewer.py +0 -0
  294. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/src/benchflow/usage_tracking.py +0 -0
  295. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/__init__.py +0 -0
  296. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/acceptance_live_harness.py +0 -0
  297. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/__init__.py +0 -0
  298. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_dirscan.py +0 -0
  299. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_loader.py +0 -0
  300. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_parity.py +0 -0
  301. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_wiring.py +0 -0
  302. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_namespace_shorthand.py +0 -0
  303. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_plugin_entry_points.py +0 -0
  304. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_protocol.py +0 -0
  305. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/agents/test_remote_manifest_autoload.py +0 -0
  306. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/README.md +0 -0
  307. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
  308. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
  309. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
  310. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/instruction.md +0 -0
  311. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
  312. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/task.md +0 -0
  313. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/task.toml +0 -0
  314. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/tests/test.sh +0 -0
  315. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/conformance-results.json +0 -0
  316. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/proof_multi_agent.py +0 -0
  317. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/proof_snapshot.py +0 -0
  318. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/run_conformance.py +0 -0
  319. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
  320. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/conftest.py +0 -0
  321. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/__init__.py +0 -0
  322. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/_helpers.py +0 -0
  323. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/test_batch.py +0 -0
  324. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/test_orchestrator.py +0 -0
  325. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/test_replay_proxy.py +0 -0
  326. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/continue_run/test_run_folder.py +0 -0
  327. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/__init__.py +0 -0
  328. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_chibench_manifest.py +0 -0
  329. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_clawsbench_manifest.py +0 -0
  330. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_manifest.py +0 -0
  331. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_manifest_env.py +0 -0
  332. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_protocol.py +0 -0
  333. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/environment/test_readiness.py +0 -0
  334. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
  335. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/instruction.md +0 -0
  336. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/solution/solve.sh +0 -0
  337. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/task.md +0 -0
  338. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/task.toml +0 -0
  339. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/tests/test.sh +0 -0
  340. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/test_claude.sh +0 -0
  341. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/test_codex.sh +0 -0
  342. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/test_codex_custom_provider.sh +0 -0
  343. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/test_gemini.sh +0 -0
  344. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/test_openclaw.sh +0 -0
  345. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/traces/minimal-claude.jsonl +0 -0
  346. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
  347. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/README.md +0 -0
  348. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
  349. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
  350. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/task.toml +0 -0
  351. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
  352. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
  353. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
  354. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/instruction.md +0 -0
  355. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/task.toml +0 -0
  356. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
  357. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent.py +0 -0
  358. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
  359. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
  360. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_openai_responses_server.py +0 -0
  361. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
  362. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
  363. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
  364. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
  365. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
  366. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
  367. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
  368. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
  369. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
  370. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
  371. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
  372. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
  373. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
  374. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
  375. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
  376. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
  377. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
  378. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
  379. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
  380. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
  381. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
  382. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
  383. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
  384. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
  385. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
  386. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
  387. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
  388. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
  389. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
  390. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
  391. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
  392. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
  393. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
  394. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
  395. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
  396. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
  397. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
  398. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
  399. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
  400. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
  401. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
  402. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
  403. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
  404. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
  405. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
  406. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
  407. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
  408. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
  409. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
  410. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
  411. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
  412. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
  413. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
  414. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
  415. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
  416. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
  417. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
  418. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
  419. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
  420. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
  421. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/_consistency.py +0 -0
  422. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/agent_judge.py +0 -0
  423. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/check_adapter_evidence.py +0 -0
  424. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/check_hosted_env_evidence.py +0 -0
  425. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/check_results.py +0 -0
  426. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
  427. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/check_trace_to_task_evidence.py +0 -0
  428. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/claude-agent-acp.yaml +0 -0
  429. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/codex-acp.yaml +0 -0
  430. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/gemini.yaml +0 -0
  431. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
  432. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/mimo.yaml +0 -0
  433. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/openclaw.yaml +0 -0
  434. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/opencode.yaml +0 -0
  435. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/openhands.yaml +0 -0
  436. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/configs/pi-acp.yaml +0 -0
  437. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/deepagents_harness.py +0 -0
  438. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/rubric_checks.py +0 -0
  439. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/run.sh +0 -0
  440. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/run_suite.py +0 -0
  441. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/scenarios.py +0 -0
  442. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/integration/suites/release.yaml +0 -0
  443. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acceptance_evidence.py +0 -0
  444. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acceptance_live.py +0 -0
  445. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acceptance_live_execution.py +0 -0
  446. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp.py +0 -0
  447. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp_capability_advertising.py +0 -0
  448. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp_mcp_servers.py +0 -0
  449. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp_model_config_dispatch.py +0 -0
  450. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp_pinned_protocol_guard.py +0 -0
  451. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_acp_setup_failure_propagation.py +0 -0
  452. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_adapter_scripts.py +0 -0
  453. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_adapters.py +0 -0
  454. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_cli.py +0 -0
  455. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_env_resolution.py +0 -0
  456. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_gemini_defaults.py +0 -0
  457. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_idle_timeout_cli.py +0 -0
  458. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_model_decouple.py +0 -0
  459. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_registry.py +0 -0
  460. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_router.py +0 -0
  461. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_router_cli_e2e.py +0 -0
  462. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_router_scaffold.py +0 -0
  463. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_setup.py +0 -0
  464. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agent_spec.py +0 -0
  465. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agentcore_builder.py +0 -0
  466. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agentcore_parallel.py +0 -0
  467. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agentcore_reaper.py +0 -0
  468. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agentcore_sandbox.py +0 -0
  469. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_agentcore_transport.py +0 -0
  470. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_api_error_capture.py +0 -0
  471. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_apple_container_sandbox.py +0 -0
  472. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_bare_model_provider.py +0 -0
  473. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_base_install_imports.py +0 -0
  474. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_bedrock_thinking.py +0 -0
  475. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_benchflow_experiment_review_validator.py +0 -0
  476. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
  477. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_branch.py +0 -0
  478. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_build_context_stage.py +0 -0
  479. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_build_review_pack.py +0 -0
  480. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_capture_trajectory.py +0 -0
  481. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_check_skillsbench_harbor_parity.py +0 -0
  482. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_clawsbench_slice.py +0 -0
  483. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_adopt_aliases.py +0 -0
  484. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_arg_validation.py +0 -0
  485. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_daytona.py +0 -0
  486. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_docs_drift.py +0 -0
  487. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_edge_case_hardening.py +0 -0
  488. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_hub_env.py +0 -0
  489. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_cli_misc.py +0 -0
  490. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_codex_review.py +0 -0
  491. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_codex_self_write_auth.py +0 -0
  492. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_config_override.py +0 -0
  493. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_config_redaction.py +0 -0
  494. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_connect_as_env.py +0 -0
  495. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_console_error_truncation.py +0 -0
  496. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_continuallearningbench_adapter.py +0 -0
  497. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_dataset_registry.py +0 -0
  498. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_command_polling.py +0 -0
  499. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_dind_compose_up.py +0 -0
  500. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_download.py +0 -0
  501. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_litellm_runtime.py +0 -0
  502. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_poll_deadline.py +0 -0
  503. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_daytona_reap.py +0 -0
  504. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_deepagents_agent.py +0 -0
  505. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_docker_prune_scoping.py +0 -0
  506. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_docker_uploads.py +0 -0
  507. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_docs_examples.py +0 -0
  508. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eng50_capabilities.py +0 -0
  509. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_env_registry.py +0 -0
  510. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_env_setup.py +0 -0
  511. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_environment_manifest_controls.py +0 -0
  512. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_artifact_cli.py +0 -0
  513. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_filters_applied.py +0 -0
  514. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_lift.py +0 -0
  515. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_sharding.py +0 -0
  516. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_single_task_summary.py +0 -0
  517. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_source_provenance.py +0 -0
  518. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_worker_retry.py +0 -0
  519. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_eval_zero_task_guard.py +0 -0
  520. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_evaluation_environment_manifest.py +0 -0
  521. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_exclude_tasks.py +0 -0
  522. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_filter_credentialed_cells.py +0 -0
  523. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_harvey_lab_shim.py +0 -0
  524. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_hilbench_adapter.py +0 -0
  525. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_hosted_env.py +0 -0
  526. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_hosted_env_rollout_contract.py +0 -0
  527. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_hub_harbor_registry.py +0 -0
  528. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_inbound_adapter_manifest.py +0 -0
  529. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_inbound_adapters.py +0 -0
  530. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_agent_judge.py +0 -0
  531. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_check_results.py +0 -0
  532. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_consistency.py +0 -0
  533. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_matrix.py +0 -0
  534. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_provider_selection.py +0 -0
  535. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_run_suite.py +0 -0
  536. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_integration_suite.py +0 -0
  537. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_internet_policy.py +0 -0
  538. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_job.py +0 -0
  539. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_job_sequential_shared.py +0 -0
  540. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_job_sequential_shared_resume.py +0 -0
  541. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_judge_robustness.py +0 -0
  542. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_judge_symlink_ingestion.py +0 -0
  543. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_learner_skills.py +0 -0
  544. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_learner_skills_traversal.py +0 -0
  545. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_learner_store.py +0 -0
  546. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_learner_store_persistence.py +0 -0
  547. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_config.py +0 -0
  548. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_hardening.py +0 -0
  549. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_logging.py +0 -0
  550. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_model_via_env_generic.py +0 -0
  551. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_reasoning_passthrough.py +0 -0
  552. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_runtime.py +0 -0
  553. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_litellm_smoke.py +0 -0
  554. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_live_llm_trajectory.py +0 -0
  555. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_llm_judge.py +0 -0
  556. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_llm_judge_event_tags.py +0 -0
  557. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_llm_judge_verifier.py +0 -0
  558. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_loop_strategies.py +0 -0
  559. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_loop_summary.py +0 -0
  560. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_loop_sweep.py +0 -0
  561. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_memory_scorer.py +0 -0
  562. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_metrics.py +0 -0
  563. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_mle_bench_adapter.py +0 -0
  564. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_mock_openai_responses_server.py +0 -0
  565. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_monitor_scaffold.py +0 -0
  566. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_native_acp_usage.py +0 -0
  567. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_no_cross_provider_fallback.py +0 -0
  568. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_notification_order_real.py +0 -0
  569. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_opencode_family_proxy_tracking.py +0 -0
  570. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_oracle.py +0 -0
  571. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_oracle_chokepoint.py +0 -0
  572. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_paths_safe.py +0 -0
  573. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_paths_symlink_helpers.py +0 -0
  574. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_pi_acp_launcher.py +0 -0
  575. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_pi_acp_proxy_routing.py +0 -0
  576. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_process.py +0 -0
  577. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_project_skills_layout.py +0 -0
  578. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_provider_auth_detection.py +0 -0
  579. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_providers.py +0 -0
  580. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_reexport.py +0 -0
  581. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_registry_invariants.py +0 -0
  582. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_release_hardening_r5.py +0 -0
  583. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_release_version.py +0 -0
  584. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_release_workflow_wiring.py +0 -0
  585. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_resolve_env_helpers.py +0 -0
  586. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_review_boundaries.py +0 -0
  587. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_review_rubric.py +0 -0
  588. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_review_runtime.py +0 -0
  589. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_reward_lenient.py +0 -0
  590. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_reward_node.py +0 -0
  591. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_reward_range.py +0 -0
  592. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_reward_unified_contract.py +0 -0
  593. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rewards.py +0 -0
  594. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rewards_jsonl.py +0 -0
  595. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_architecture.py +0 -0
  596. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_branch.py +0 -0
  597. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_config_path_coercion.py +0 -0
  598. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_environment.py +0 -0
  599. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_hard_deadline.py +0 -0
  600. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_import_no_side_effects.py +0 -0
  601. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_on_ask_user_wiring.py +0 -0
  602. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_planes_contract.py +0 -0
  603. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_probe_sandbox_health.py +0 -0
  604. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_session_factory_dispatch.py +0 -0
  605. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_setup_commands.py +0 -0
  606. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rollout_upload.py +0 -0
  607. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rubric_checks.py +0 -0
  608. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_rubric_config.py +0 -0
  609. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_runtime.py +0 -0
  610. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_runtime_capabilities.py +0 -0
  611. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_runtime_config_wired.py +0 -0
  612. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_runtime_live_sandbox.py +0 -0
  613. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox.py +0 -0
  614. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_exec_secret_handling.py +0 -0
  615. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_hardening.py +0 -0
  616. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
  617. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_live_process.py +0 -0
  618. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_multi_service.py +0 -0
  619. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_prebuilt_validation.py +0 -0
  620. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_protocol.py +0 -0
  621. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_provider_registry_drift.py +0 -0
  622. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_setup.py +0 -0
  623. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_snapshot_contract.py +0 -0
  624. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_upload_symlink.py +0 -0
  625. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sandbox_verifier_workspace.py +0 -0
  626. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_scene.py +0 -0
  627. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_scene_outbox_trial.py +0 -0
  628. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_scene_parallel_group.py +0 -0
  629. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_scene_result_aggregation.py +0 -0
  630. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_scoring.py +0 -0
  631. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sdk_internals.py +0 -0
  632. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sdk_lockdown.py +0 -0
  633. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sdk_run_alias.py +0 -0
  634. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_sealed_channel_container.py +0 -0
  635. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_self_gen_cli.py +0 -0
  636. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_self_gen_export_error_channel.py +0 -0
  637. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_self_gen_export_failures.py +0 -0
  638. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_self_gen_orchestration.py +0 -0
  639. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_session_factory_runtime.py +0 -0
  640. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_session_request_permission_dispatch.py +0 -0
  641. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_eval.py +0 -0
  642. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_dryrun.py +0 -0
  643. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_integration.py +0 -0
  644. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_sweep.py +0 -0
  645. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_traversal.py +0 -0
  646. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_invocation_artifacts.py +0 -0
  647. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skill_policy.py +0 -0
  648. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skills.py +0 -0
  649. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skills_dir_agent_home_link.py +0 -0
  650. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skillsbench_conversion_conformance.py +0 -0
  651. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_skillsbench_harbor_run_suite.py +0 -0
  652. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_smoke.py +0 -0
  653. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_smoke_wiring.py +0 -0
  654. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_source_adapters.py +0 -0
  655. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_subscription_auth.py +0 -0
  656. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_check_eval_consistency.py +0 -0
  657. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_config.py +0 -0
  658. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_digest.py +0 -0
  659. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_document.py +0 -0
  660. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_download.py +0 -0
  661. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_export.py +0 -0
  662. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_output_format.py +0 -0
  663. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_package.py +0 -0
  664. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_task_runtime_primitive.py +0 -0
  665. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_tasks.py +0 -0
  666. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_token_usage_normalization.py +0 -0
  667. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trace_import_cli.py +0 -0
  668. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trace_task_gen_traversal.py +0 -0
  669. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trace_to_task_evidence.py +0 -0
  670. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_traces_huggingface.py +0 -0
  671. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_traces_parsers.py +0 -0
  672. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_traces_task_gen.py +0 -0
  673. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_train_cli.py +0 -0
  674. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_train_mode_artifact_emission.py +0 -0
  675. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_train_trl_cli.py +0 -0
  676. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trajectory_integration.py +0 -0
  677. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trajectory_streaming.py +0 -0
  678. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trial_agent_timeout_verify.py +0 -0
  679. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trial_install_agent_timeout.py +0 -0
  680. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trial_litellm_runtime.py +0 -0
  681. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_trl_integration.py +0 -0
  682. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_usage_litellm.py +0 -0
  683. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_usage_required.py +0 -0
  684. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_usage_tracking.py +0 -0
  685. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_user.py +0 -0
  686. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_v06_guard_ports.py +0 -0
  687. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_document.py +0 -0
  688. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_multi_container.py +0 -0
  689. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_output.py +0 -0
  690. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_output_freshness.py +0 -0
  691. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_strategies.py +0 -0
  692. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verifier_wedge_retry.py +0 -0
  693. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_verify.py +0 -0
  694. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_workflow_action_pinning.py +0 -0
  695. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/test_yaml_config.py +0 -0
  696. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/__init__.py +0 -0
  697. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export.py +0 -0
  698. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_adp.py +0 -0
  699. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_atif.py +0 -0
  700. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_common.py +0 -0
  701. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_nan_handling.py +0 -0
  702. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_prime_sft.py +0 -0
  703. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_redaction.py +0 -0
  704. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_step_granularity.py +0 -0
  705. {benchflow-0.6.7.dev1839 → benchflow-0.6.7.dev1841}/tests/trajectories/test_tree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: benchflow
3
- Version: 0.6.7.dev1839
3
+ Version: 0.6.7.dev1841
4
4
  Summary: Multi-turn agent benchmarking with ACP — run any agent, any model, any provider.
5
5
  Project-URL: Homepage, https://github.com/benchflow-ai/benchflow
6
6
  Project-URL: Repository, https://github.com/benchflow-ai/benchflow
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "benchflow"
3
- version = "0.6.7.dev1839"
3
+ version = "0.6.7.dev1841"
4
4
  description = "Multi-turn agent benchmarking with ACP — run any agent, any model, any provider."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -19,12 +19,15 @@ class SessionCounters(NamedTuple):
19
19
  """The live ACP session counters the console heartbeat logs.
20
20
 
21
21
  ``total_tokens`` is None until the session has a usage snapshot (i.e.
22
- after a completed prompt).
22
+ after a completed prompt). ``distinct_tools`` counts distinct tool
23
+ display titles seen this session; None means unknown, which renderers
24
+ treat like varied (keep the ``last:`` cell).
23
25
  """
24
26
 
25
27
  tool_calls: int
26
28
  last_tool: str
27
29
  total_tokens: int | None
30
+ distinct_tools: int | None = None
28
31
 
29
32
 
30
33
  class ActivitySnapshot(NamedTuple):
@@ -138,6 +138,17 @@ def _canonical_tool_kind(kind: object, title: object = "") -> str:
138
138
  return raw_kind
139
139
 
140
140
 
141
+ def _tool_display_title(title: str, kind: str) -> str:
142
+ """A tool call's display title: first line of ``title``, else ``kind``.
143
+
144
+ ``split`` not ``splitlines`` so a whitespace-only title strips to ``""``
145
+ instead of raising on an empty line list. Shared by the heartbeat/dashboard
146
+ snapshot and the distinct-title tracker so "distinct" means exactly
147
+ "renders differently".
148
+ """
149
+ return (title or kind or "").strip().split("\n", 1)[0]
150
+
151
+
141
152
  class ToolCallRecord:
142
153
  """Record of a single tool call within a session.
143
154
 
@@ -191,6 +202,12 @@ class ACPSession:
191
202
  self.thought_chunks: list[str] = []
192
203
  self.tool_calls: list[ToolCallRecord] = []
193
204
  self._tool_call_map: dict[str, ToolCallRecord] = {}
205
+ # Distinct display titles across recorded tool calls, maintained
206
+ # incrementally at record creation so the eval dashboard can detect
207
+ # single-tool agents (prime-agent funnels everything through one
208
+ # IPython tool — a constant "last: IPython cell" carries no
209
+ # information) in O(1) at render time.
210
+ self._seen_tool_titles: set[str] = set()
194
211
  self.stop_reason: StopReason | None = None
195
212
  self.usage_snapshots: list[ACPUsageSnapshot] = []
196
213
  self.created_at = datetime.now()
@@ -226,15 +243,24 @@ class ACPSession:
226
243
  counters, also polled by the live eval dashboard's activity cell.
227
244
 
228
245
  The title is the raw first line (untruncated — display width belongs
229
- to each render site); ``split`` not ``splitlines`` so a whitespace-only
230
- title strips to ``""`` instead of raising on an empty line list.
246
+ to each render site; see :func:`_tool_display_title`).
231
247
  """
232
248
  title = ""
233
249
  if self.tool_calls:
234
250
  last = self.tool_calls[-1]
235
- title = (last.title or last.kind or "").strip().split("\n", 1)[0]
251
+ title = _tool_display_title(last.title, last.kind)
236
252
  return len(self.tool_calls), title
237
253
 
254
+ @property
255
+ def distinct_tool_titles(self) -> int:
256
+ """Count of distinct display titles across recorded tool calls.
257
+
258
+ O(1) read for the eval dashboard: ``1`` with several calls means a
259
+ single-tool agent, whose activity cell drops the constant ``last:``
260
+ suffix in favour of the token count.
261
+ """
262
+ return len(self._seen_tool_titles)
263
+
238
264
  def _maybe_log_progress(self) -> None:
239
265
  if not self._progress_enabled or self._prompt_started_at is None:
240
266
  return
@@ -324,6 +350,22 @@ class ACPSession:
324
350
  self.events.append(current)
325
351
  self._pending_text.clear()
326
352
 
353
+ def _record_tool_call(self, record: ToolCallRecord) -> None:
354
+ """Register a newly created tool-call record in every live structure.
355
+
356
+ Single bookkeeping site for the two creation paths in
357
+ :meth:`handle_update` (``tool_call``, and the ``tool_call_update``
358
+ fallback for unseen ids), so the distinct-title tracker can never
359
+ drift from the record list. ``title`` itself is never rewritten after
360
+ creation, but an empty-title record's display title follows ``kind``,
361
+ which the legacy-skill upgrade can rewrite — that site re-registers
362
+ the new display title (over-counting fails safe).
363
+ """
364
+ self.tool_calls.append(record)
365
+ self._tool_call_map[record.tool_call_id] = record
366
+ self._seen_tool_titles.add(_tool_display_title(record.title, record.kind))
367
+ self.events.append({"type": "tool_call", "record": record})
368
+
327
369
  _RECOGNIZED_UPDATE_TYPES = frozenset(
328
370
  {
329
371
  "tool_call",
@@ -356,9 +398,7 @@ class ACPSession:
356
398
  update.get("kind", "other"), update.get("title", "")
357
399
  ),
358
400
  )
359
- self.tool_calls.append(record)
360
- self._tool_call_map[record.tool_call_id] = record
361
- self.events.append({"type": "tool_call", "record": record})
401
+ self._record_tool_call(record)
362
402
 
363
403
  elif update_type == "tool_call_update":
364
404
  tc_id = update.get("toolCallId", "")
@@ -372,9 +412,7 @@ class ACPSession:
372
412
  update.get("kind", "tool"), update.get("title", "")
373
413
  ),
374
414
  )
375
- self.tool_calls.append(record)
376
- self._tool_call_map[tc_id] = record
377
- self.events.append({"type": "tool_call", "record": record})
415
+ self._record_tool_call(record)
378
416
  try:
379
417
  status = ToolCallStatus(update.get("status", "in_progress"))
380
418
  except ValueError:
@@ -390,6 +428,14 @@ class ACPSession:
390
428
  record.kind, record.title, record.content
391
429
  ):
392
430
  record.kind = "skill"
431
+ # An empty-title record's DISPLAY title falls back to kind, so
432
+ # this upgrade can change what renders. Re-register the new
433
+ # display title: the set may now over-count (creation-time
434
+ # fallback + "skill"), which fails safe — the cell keeps the
435
+ # last: suffix instead of falsely claiming a single tool.
436
+ self._seen_tool_titles.add(
437
+ _tool_display_title(record.title, record.kind)
438
+ )
393
439
 
394
440
  elif update_type == "agent_message_chunk":
395
441
  content = update.get("content", {})
@@ -0,0 +1,167 @@
1
+ """Verifier-artifact mining for the eval report's failure lines.
2
+
3
+ The one file-touching corner of the CLI's final report block: when a failed
4
+ task's reason would otherwise be the bare ``reward X`` fallback, mine the
5
+ rollout's verifier artifacts for a one-line explanation. Lives in its own
6
+ module so ``cli/_shared.py`` stays the side-effect-free display helpers it
7
+ advertises.
8
+
9
+ Contract (the engine stays file-free — these reads are CLI-side, report-time
10
+ only):
11
+
12
+ - The rollout dir is resolved exactly, from the ``rollout_name`` the engine
13
+ records on every result — never guessed from globs.
14
+ - Evidence sources are tried in order (CTRF report, then test-stdout tail);
15
+ the first that yields a line wins.
16
+ - Every read is bounded (``_ARTIFACT_READ_BYTES`` per file) and nothing here
17
+ raises — any surprise degrades to ``None``, i.e. the bare reward reason.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import json
23
+ import re
24
+ from typing import TYPE_CHECKING, NamedTuple
25
+
26
+ if TYPE_CHECKING:
27
+ from collections.abc import Callable
28
+ from pathlib import Path
29
+
30
+ # Never read more than this many bytes per file, and evidence is only mined
31
+ # for the <= _MAX_FAILURE_LINES tasks the report block displays.
32
+ _ARTIFACT_READ_BYTES = 64 * 1024
33
+ # Pytest final summary, decoration stripped: "1 failed, 2 passed in 40.86s".
34
+ _PYTEST_SUMMARY_RE = re.compile(r"\d+ failed\b")
35
+
36
+
37
+ class FailureLine(NamedTuple):
38
+ """A failure one-liner in two parts with distinct truncation contracts.
39
+
40
+ ``body`` is the free-text evidence (test name plus assertion) and competes
41
+ for the display line's char budget; ``suffix`` is the compact multi-failure
42
+ roll-up count (empty when the evidence covers everything) and must survive
43
+ display truncation. Renderers give ``body`` the full line budget and append
44
+ ``suffix`` whole past it — never truncating the concatenation, or a long
45
+ assertion would silently eat the "there is more broken than this" signal.
46
+ """
47
+
48
+ body: str
49
+ suffix: str = ""
50
+
51
+
52
+ def _display_test_name(raw_name: str) -> str:
53
+ """Test name for display: node-id path segments dropped, param id kept.
54
+
55
+ Full pytest node ids ("tests/test_x.py::test_build[param]") waste the
56
+ 100-char line budget; keep the function name plus any ``[param]`` id.
57
+ The split must not touch the bracket part — a param id may itself contain
58
+ ``::`` — so only the text before the first ``[`` is segment-split. (When
59
+ the report was written by pytest-json-ctrf — as of 0.5.x — the param id
60
+ is already gone — the plugin stores ``nodeid.split('[')[0]`` as ``name``
61
+ — but other CTRF producers keep the full name, and we must not re-trim
62
+ it.)
63
+ """
64
+ head, bracket, param = raw_name.partition("[")
65
+ return head.rsplit("::", 1)[-1] + bracket + param
66
+
67
+
68
+ def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
69
+ """``<test> failed[: <assertion>]`` from the first failed CTRF test.
70
+
71
+ The verifier's pytest run writes a CTRF report (``pytest --ctrf``, see the
72
+ standard path in ``task_authoring/structural_checks.py``). Per test the
73
+ useful failure evidence is the ``E …`` assertion line inside ``trace``;
74
+ ``message`` is only a generic phase description, so it is the fallback.
75
+ When the report holds more than one failed test, the first failure's line
76
+ carries a count suffix (``(+N more failures; P/T checks passed)``) so the
77
+ console never under-reports how much is broken.
78
+ """
79
+ if ctrf_path.stat().st_size > _ARTIFACT_READ_BYTES:
80
+ # JSON only parses whole — an oversized report is skipped (not
81
+ # truncated) and the next evidence source gets its turn.
82
+ return None
83
+ data = json.loads(ctrf_path.read_text(encoding="utf-8", errors="replace"))
84
+ raw_tests = (data.get("results") or {}).get("tests") or []
85
+ tests = [test for test in raw_tests if isinstance(test, dict)]
86
+ failed = [test for test in tests if test.get("status") == "failed"]
87
+ if not failed:
88
+ return None
89
+ suffix = ""
90
+ if len(failed) > 1:
91
+ # Counts come from the same rolled-up test list the first-failure pick
92
+ # uses, so the suffix can never disagree with the shown evidence.
93
+ # T is all entries — skips count against the denominator, not as passes.
94
+ extra = len(failed) - 1
95
+ passed = sum(1 for test in tests if test.get("status") == "passed")
96
+ plural = "" if extra == 1 else "s"
97
+ suffix = (
98
+ f" (+{extra} more failure{plural}; {passed}/{len(tests)} checks passed)"
99
+ )
100
+ test = failed[0]
101
+ name = _display_test_name(str(test.get("name") or "test"))
102
+ trace = test.get("trace")
103
+ if isinstance(trace, str):
104
+ for line in trace.splitlines():
105
+ stripped = line.strip()
106
+ if stripped.startswith("E "):
107
+ assertion = stripped[2:].strip()
108
+ # "<test> failed:" already says it's an assertion — drop
109
+ # the prefix to reclaim line budget for the message.
110
+ assertion = assertion.removeprefix("AssertionError: ")
111
+ return FailureLine(f"{name} failed: {assertion}", suffix)
112
+ message = test.get("message")
113
+ if isinstance(message, str) and message.strip():
114
+ return FailureLine(f"{name} failed: {' '.join(message.split())}", suffix)
115
+ return FailureLine(f"{name} failed", suffix)
116
+
117
+
118
+ def _stdout_tail_failure_line(stdout_path: Path) -> FailureLine | None:
119
+ """Last pytest summary ("N failed, M passed …") — else last ``FAILED …``
120
+ line — from a bounded tail of the verifier's test-stdout capture. No count
121
+ suffix: the summary line already carries the full counts itself."""
122
+ with stdout_path.open("rb") as fh:
123
+ fh.seek(0, 2) # SEEK_END
124
+ fh.seek(max(0, fh.tell() - _ARTIFACT_READ_BYTES))
125
+ tail = fh.read(_ARTIFACT_READ_BYTES).decode("utf-8", errors="replace")
126
+ last_failed: str | None = None
127
+ for line in reversed(tail.splitlines()):
128
+ bare = line.strip().strip("=").strip()
129
+ if _PYTEST_SUMMARY_RE.match(bare):
130
+ return FailureLine(bare)
131
+ if last_failed is None and line.strip().startswith("FAILED "):
132
+ last_failed = line.strip()
133
+ return FailureLine(last_failed) if last_failed is not None else None
134
+
135
+
136
+ def artifact_failure_evidence(
137
+ job_dir: Path, rollout_name: str
138
+ ) -> tuple[FailureLine, Path] | None:
139
+ """``FailureLine`` mined from the rollout's verifier artifacts, or ``None``.
140
+
141
+ Returns the structured one-liner plus the verifier dir it came from (for
142
+ the report block's single ``(details: …)`` pointer line). Never raises.
143
+ """
144
+ # Local import: RolloutPaths pulls in the task package, which the CLI
145
+ # shouldn't pay for until a failure actually needs artifact evidence.
146
+ from benchflow.task.paths import RolloutPaths
147
+
148
+ rollout_paths = RolloutPaths(rollout_dir=job_dir / rollout_name)
149
+ verifier_dir = rollout_paths.verifier_dir
150
+ attempts: list[tuple[Path, Callable[[Path], FailureLine | None]]] = [
151
+ # ctrf.json has no RolloutPaths property — the verifier recovers it by
152
+ # literal name (verifier_core.py, `_recover_main_verifier_outputs`).
153
+ (verifier_dir / "ctrf.json", _ctrf_failure_line),
154
+ (rollout_paths.test_stdout_path, _stdout_tail_failure_line),
155
+ ]
156
+ for path, extract in attempts:
157
+ try:
158
+ if not path.is_file():
159
+ continue
160
+ detail = extract(path)
161
+ except Exception:
162
+ # Unreadable file, bad JSON, permissions … try the next source;
163
+ # the report must never crash over evidence mining.
164
+ continue
165
+ if detail is not None:
166
+ return detail, verifier_dir
167
+ return None
@@ -3,7 +3,9 @@
3
3
  Renders a single Rich :class:`~rich.live.Live` panel — a progress bar with ETA,
4
4
  queued/running/passed/failed/errored counts, a "running now" table, and running
5
5
  token / cost / pass-rate totals — fed by the :class:`~benchflow.evaluation.Evaluation`
6
- engine's ``on_plan`` / ``on_task_start`` / ``on_result`` hooks.
6
+ engine's ``on_plan`` / ``on_task_start`` / ``on_result`` hooks, plus render-time
7
+ polls of the live-activity registry for the running tasks' in-flight session
8
+ counters (activity cells and the footer's live token sum).
7
9
 
8
10
  TTY-only by contract: the CLI keeps its plain ``logger.info`` lines when stdout
9
11
  isn't a terminal (CI, pipes, parity files), so machine-readable output is never
@@ -149,18 +151,21 @@ _PHASE_LABELS = {
149
151
  _PHASE_FALLBACK = "starting…"
150
152
 
151
153
 
152
- def _activity_cell(name: str) -> str:
154
+ def _activity_cell(snap: live_activity.ActivitySnapshot | None) -> str:
153
155
  """Per-task activity for the "running now" table, e.g.
154
156
  ``38 calls · last: file_editor``.
155
157
 
156
- Polls the live rollout's ACP session counters — the same ones the console
157
- heartbeat logs, which the Live display otherwise mutes — via the
158
- live-activity registry. Until the agent session exists (and after it is
159
- closed for the verifier) the cell shows the rollout's lifecycle phase as a
160
- label instead, so the row is never blank. Tokens appear only once the
161
- session has a usage snapshot (i.e. after a completed prompt).
158
+ Pure formatter over one polled :class:`~benchflow._utils.live_activity.
159
+ ActivitySnapshot` ``__rich__`` polls the registry exactly once per
160
+ running task per frame and shares the snapshots with the footer's live
161
+ token sum. The counters are the same ones the console heartbeat logs,
162
+ which the Live display otherwise mutes. Until the agent session exists
163
+ (and after it is closed for the verifier) the cell shows the rollout's
164
+ lifecycle phase as a label instead, and a registry miss (None) shows the
165
+ fallback label, so the row is never blank. Tokens appear only once the
166
+ session has a usage snapshot (i.e. after a completed prompt); once they
167
+ do, a single-tool agent's cell is ``38 calls · 412.0k tok`` (no ``last:``).
162
168
  """
163
- snap = live_activity.activity(name)
164
169
  if snap is None:
165
170
  return _PHASE_FALLBACK
166
171
  counters = snap.counters
@@ -169,7 +174,12 @@ def _activity_cell(name: str) -> str:
169
174
  cell = f"{counters.tool_calls} calls"
170
175
  if counters.total_tokens:
171
176
  cell += f" · {_fmt_tokens(counters.total_tokens)} tok"
172
- if counters.last_tool:
177
+ # A single-tool agent (prime-agent funnels every call through one IPython
178
+ # tool) makes "last: <name>" a constant: once tokens carry the signal,
179
+ # drop it. Varied tool names — and unknown distinct counts (0), and a
180
+ # first lone call, where the name is still news — keep the last: suffix.
181
+ constant_tool = counters.tool_calls > 1 and counters.distinct_tools == 1
182
+ if counters.last_tool and not (constant_tool and counters.total_tokens):
173
183
  cell += f" · last: {counters.last_tool[:30]}"
174
184
  return cell
175
185
 
@@ -335,6 +345,13 @@ class LiveEvalProgress:
335
345
 
336
346
  parts: list[RenderableType] = [header, bar, counts]
337
347
 
348
+ # ONE registry poll per running task per frame (each poll an O(1)
349
+ # counter read; see live_activity), shared by the running-now cells
350
+ # and the footer's live token sum — displayed rows are never polled
351
+ # twice, and cell vs footer can't read different snapshots within a
352
+ # frame.
353
+ snaps = {name: live_activity.activity(name) for name in running}
354
+
338
355
  # "Running now" — cap rows so short terminals don't overflow.
339
356
  if running:
340
357
  tbl = Table(
@@ -354,16 +371,34 @@ class LiveEvalProgress:
354
371
  tbl.add_row(
355
372
  Text(name),
356
373
  _fmt_dur(now - running[name]),
357
- Text(_activity_cell(name), style="dim"),
374
+ Text(_activity_cell(snaps.get(name)), style="dim"),
358
375
  )
359
376
  extra = len(running) - _MAX_RUNNING_ROWS
360
377
  if extra > 0:
361
378
  tbl.add_row(f"… {extra} more", "", "")
362
379
  parts.append(tbl)
363
380
 
364
- # Footer: pass-rate (excl errors) + token/cost economics. Show "—" (not
365
- # 0 / $0.00) when no trusted telemetry, so a coverage-0 run reads broken,
366
- # not free matching the summary.json contract.
381
+ # Footer: pass-rate (excl errors) + token/cost economics. Tokens sum
382
+ # the completed tasks' trusted telemetry PLUS the running sessions'
383
+ # live ACP usage (stepping forward as each prompt completes), so a
384
+ # 51-minute agent phase shows its spend while it runs, not only at
385
+ # scoring. The total is NOT monotonic across a task's completion
386
+ # boundary: scoring swaps the ACP self-report for the gateway
387
+ # measurement (which can be lower), and a task completing with
388
+ # untrusted/absent telemetry drops its live contribution entirely —
389
+ # a sole-task footer can collapse back to "— tokens". Clamping would
390
+ # falsify the trusted sum, so the dip is intended. Show "—" (not 0 /
391
+ # $0.00) when neither signal exists, so a coverage-0 run reads
392
+ # broken, not free — matching the summary.json contract. Cost stays
393
+ # completed-tasks-only: $ comes from the sandbox LiteLLM gateway log
394
+ # imported at scoring time (BenchFlow computes no prices of its own),
395
+ # so there is no live $ to show.
396
+ live_tokens = sum(
397
+ snap.counters.total_tokens or 0
398
+ for snap in snaps.values()
399
+ if snap is not None and snap.counters is not None
400
+ )
401
+
367
402
  footer = Text()
368
403
  scored = passed + failed
369
404
  if scored:
@@ -371,7 +406,12 @@ class LiveEvalProgress:
371
406
  else:
372
407
  footer.append("pass-rate —", style="dim")
373
408
  footer.append(" · ")
374
- footer.append(f"{_fmt_tokens(tokens)} tokens" if covered else "— tokens", "dim")
409
+ footer.append(
410
+ f"{_fmt_tokens(tokens + live_tokens)} tokens"
411
+ if covered or live_tokens
412
+ else "— tokens",
413
+ "dim",
414
+ )
375
415
  footer.append(" · ")
376
416
  footer.append(f"${cost:.2f}" if covered else "$—", style="dim")
377
417
  if completed:
@@ -21,7 +21,7 @@ from rich.console import Console
21
21
  from rich.markup import escape
22
22
 
23
23
  from benchflow._utils.text import truncate_end
24
- from benchflow.cli._failure_evidence import artifact_failure_evidence
24
+ from benchflow.cli._failure_evidence import FailureLine, artifact_failure_evidence
25
25
 
26
26
  if TYPE_CHECKING:
27
27
  from pathlib import Path
@@ -106,7 +106,8 @@ def _exit_if_evaluation_had_errors(result: object) -> None:
106
106
 
107
107
 
108
108
  # Final-block failure lines: keep the block skimmable on big jobs and each
109
- # line inside a typical terminal width.
109
+ # line inside a typical terminal width — except lines carrying a multi-failure
110
+ # count suffix, which deliberately run ~40 chars past the budget.
110
111
  _MAX_FAILURE_LINES = 5
111
112
  _FAILURE_LINE_LIMIT = 100
112
113
  _FAILURE_REASON_METRICS = 3
@@ -114,7 +115,7 @@ _FAILURE_REASON_METRICS = 3
114
115
 
115
116
  def _failure_reason(
116
117
  failure: TaskFailure, job_dir: Path | None = None
117
- ) -> tuple[str, Path | None]:
118
+ ) -> tuple[FailureLine, Path | None]:
118
119
  """One cheap line explaining why a FAILED (scored, reward != 1) task
119
120
  failed, plus the verifier dir when artifacts supplied the evidence.
120
121
 
@@ -123,13 +124,15 @@ def _failure_reason(
123
124
  first — they explain the miss); else the reward plus a one-liner mined
124
125
  from the rollout's verifier artifacts (bounded CLI-side reads resolved via
125
126
  the ``rollout_name`` the engine records — the engine stays file-free);
126
- else just the reward. The returned path is non-``None`` only for the
127
- artifact tier, so the caller can print one ``(details: …)`` pointer per
128
- report block.
127
+ else just the reward. The reason is a ``FailureLine`` so the artifact
128
+ tier's multi-failure count suffix stays separable from the truncatable
129
+ body (only the artifact tier ever sets it). The returned path is
130
+ non-``None`` only for the artifact tier, so the caller can print one
131
+ ``(details: …)`` pointer per report block.
129
132
  """
130
133
  if failure.verifier_error:
131
134
  # Collapse whitespace: verifier errors are routinely multi-line.
132
- return " ".join(failure.verifier_error.split()), None
135
+ return FailureLine(" ".join(failure.verifier_error.split())), None
133
136
  rewards = failure.rewards or {}
134
137
  reward = rewards.get("reward")
135
138
  metrics = [
@@ -144,15 +147,18 @@ def _failure_reason(
144
147
  shown = ", ".join(
145
148
  f"{name} {value}" for name, value in metrics[:_FAILURE_REASON_METRICS]
146
149
  )
147
- return f"reward {reward} — {shown}", None
150
+ return FailureLine(f"reward {reward} — {shown}"), None
148
151
  # No rollout_name (pre-#957-follow-up result.json, sharded aggregation):
149
152
  # nothing to resolve — the bare reward is as honest as it gets.
150
153
  if job_dir is not None and failure.rollout_name:
151
154
  evidence = artifact_failure_evidence(job_dir, failure.rollout_name)
152
155
  if evidence is not None:
153
156
  detail, verifier_dir = evidence
154
- return f"reward {reward} — {detail}", verifier_dir
155
- return f"reward {reward}", None
157
+ return (
158
+ FailureLine(f"reward {reward} — {detail.body}", detail.suffix),
159
+ verifier_dir,
160
+ )
161
+ return FailureLine(f"reward {reward}"), None
156
162
 
157
163
 
158
164
  def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -> None:
@@ -207,11 +213,16 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
207
213
  reason, verifier_dir = _failure_reason(failure, job_dir)
208
214
  if artifact_pointer is None and verifier_dir is not None:
209
215
  artifact_pointer = verifier_dir
210
- line = truncate_end(
211
- f" ✗ {failure.task_name}: {reason}",
216
+ # The char budget governs only the free-text body; the multi-failure
217
+ # count suffix is appended AFTER truncation so a long assertion can
218
+ # never swallow the "more than this is broken" signal. Worst case the
219
+ # line runs ~40 chars past the budget — completeness beats strict
220
+ # width for this one signal.
221
+ body = truncate_end(
222
+ f" ✗ {failure.task_name}: {reason.body}",
212
223
  _FAILURE_LINE_LIMIT,
213
224
  )
214
- console.print(f"[dim]{escape(line)}[/dim]")
225
+ console.print(f"[dim]{escape(body + reason.suffix)}[/dim]")
215
226
  extra = len(failures) - _MAX_FAILURE_LINES
216
227
  if extra > 0:
217
228
  console.print(f"[dim] … and {extra} more[/dim]")
@@ -759,7 +759,8 @@ class Rollout:
759
759
  def activity_snapshot(self) -> ActivitySnapshot:
760
760
  """The eval dashboard's per-task :class:`ActivitySnapshot`: the
761
761
  current lifecycle phase plus the live :class:`SessionCounters` (tool
762
- calls, last tool title, total tokens). ``counters`` is None before
762
+ calls, last tool title, total tokens, distinct tool titles).
763
+ ``counters`` is None before
763
764
  the agent session exists — the phase then carries the cell
764
765
  ("creating sandbox…", "verifying…"), so a 90s sandbox create is not
765
766
  indistinguishable from a hang.
@@ -775,7 +776,10 @@ class Rollout:
775
776
  calls, last_title = session.progress_snapshot()
776
777
  usage = session.latest_usage_totals()
777
778
  tokens = usage.get("total_tokens") if usage else None
778
- return ActivitySnapshot(self._phase, SessionCounters(calls, last_title, tokens))
779
+ return ActivitySnapshot(
780
+ self._phase,
781
+ SessionCounters(calls, last_title, tokens, session.distinct_tool_titles),
782
+ )
779
783
 
780
784
  @property
781
785
  def trajectory(self) -> list[dict]: