benchflow 0.6.7.dev1840__tar.gz → 0.6.7.dev1843__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 (704) hide show
  1. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/PKG-INFO +1 -1
  2. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/pyproject.toml +1 -1
  3. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/live_activity.py +4 -1
  4. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/session.py +55 -9
  5. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/_failure_evidence.py +151 -16
  6. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/_live_progress.py +55 -15
  7. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/_shared.py +40 -45
  8. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/__init__.py +6 -2
  9. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_live_progress.py +399 -118
  10. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_console_progress.py +50 -0
  11. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/.gitignore +0 -0
  12. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/CHANGELOG.md +0 -0
  13. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/LICENSE +0 -0
  14. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/README.md +0 -0
  15. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/__init__.py +0 -0
  16. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_dotenv.py +0 -0
  17. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_paths.py +0 -0
  18. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_run.py +0 -0
  19. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_types.py +0 -0
  20. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/__init__.py +0 -0
  21. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/benchmark_repos.py +0 -0
  22. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/build_context_stage.py +0 -0
  23. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/config.py +0 -0
  24. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/config_override.py +0 -0
  25. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/content_address.py +0 -0
  26. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/dataset_registry.py +0 -0
  27. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/env_registry.py +0 -0
  28. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/evaluation_results.py +0 -0
  29. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/hf_datasets.py +0 -0
  30. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/json_safe.py +0 -0
  31. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/learner_memory.py +0 -0
  32. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/result_metadata.py +0 -0
  33. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/reward_events.py +0 -0
  34. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/scoring.py +0 -0
  35. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/source_provenance.py +0 -0
  36. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
  37. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
  38. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
  39. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
  40. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
  41. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/text.py +0 -0
  42. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/_utils/yaml_loader.py +0 -0
  43. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/__init__.py +0 -0
  44. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/client.py +0 -0
  45. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/container_transport.py +0 -0
  46. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/runtime.py +0 -0
  47. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/selection.py +0 -0
  48. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/transport.py +0 -0
  49. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/acp/types.py +0 -0
  50. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/__init__.py +0 -0
  51. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/_toolathlon.py +0 -0
  52. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/_toolathlon_container.py +0 -0
  53. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
  54. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
  55. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/_toolathlon_services.py +0 -0
  56. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/harbor.py +0 -0
  57. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/inbound.py +0 -0
  58. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/inspect_ai.py +0 -0
  59. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/ors.py +0 -0
  60. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/resources/__init__.py +0 -0
  61. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
  62. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
  63. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/adapters/source.py +0 -0
  64. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agent_router.py +0 -0
  65. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agent_router_guide.py +0 -0
  66. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agent_router_parity.py +0 -0
  67. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agent_router_scaffold.py +0 -0
  68. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/__init__.py +0 -0
  69. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/codex_config.py +0 -0
  70. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/credentials.py +0 -0
  71. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
  72. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/env.py +0 -0
  73. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/errors.py +0 -0
  74. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
  75. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/install.py +0 -0
  76. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/manifest.py +0 -0
  77. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
  78. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/pi_acp_launcher.py +0 -0
  79. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/protocol.py +0 -0
  80. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/providers.py +0 -0
  81. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/registry.py +0 -0
  82. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/agents/remote_manifests.py +0 -0
  83. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/branch.py +0 -0
  84. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/__init__.py +0 -0
  85. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/_hosted_env.py +0 -0
  86. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/_options.py +0 -0
  87. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/adopt.py +0 -0
  88. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/agent.py +0 -0
  89. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/continue_cmd.py +0 -0
  90. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/environment.py +0 -0
  91. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/eval_artifacts.py +0 -0
  92. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/eval_lift.py +0 -0
  93. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/hub.py +0 -0
  94. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/main.py +0 -0
  95. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/monitor.py +0 -0
  96. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/review.py +0 -0
  97. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/sandbox.py +0 -0
  98. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/skills.py +0 -0
  99. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/tasks.py +0 -0
  100. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/trace_import.py +0 -0
  101. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/cli/train.py +0 -0
  102. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/__init__.py +0 -0
  103. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/batch.py +0 -0
  104. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/orchestrator.py +0 -0
  105. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/replay_proxy.py +0 -0
  106. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/run_folder.py +0 -0
  107. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
  108. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/contracts/__init__.py +0 -0
  109. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/contracts/planes.py +0 -0
  110. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/contracts/user.py +0 -0
  111. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/demo_task/environment/Dockerfile +0 -0
  112. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/demo_task/instruction.md +0 -0
  113. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/demo_task/task.md +0 -0
  114. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/demo_task/task.toml +0 -0
  115. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/demo_task/tests/test.sh +0 -0
  116. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/diagnostics.py +0 -0
  117. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/__init__.py +0 -0
  118. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
  119. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
  120. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/manifest.py +0 -0
  121. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/manifest_env.py +0 -0
  122. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/protocol.py +0 -0
  123. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/environment/readiness.py +0 -0
  124. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/eval_artifacts.py +0 -0
  125. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/eval_lift.py +0 -0
  126. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/eval_plan.py +0 -0
  127. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/eval_sharding.py +0 -0
  128. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/eval_worker.py +0 -0
  129. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/evaluation.py +0 -0
  130. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/experimental/__init__.py +0 -0
  131. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/experimental/mcp/__init__.py +0 -0
  132. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/experimental/mcp/hooks.py +0 -0
  133. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
  134. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/hosted_env.py +0 -0
  135. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/hub/__init__.py +0 -0
  136. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/hub/harbor_registry.py +0 -0
  137. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/integrations/__init__.py +0 -0
  138. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/integrations/trl/__init__.py +0 -0
  139. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/integrations/trl/spec.py +0 -0
  140. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/learner_skills.py +0 -0
  141. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/learner_store.py +0 -0
  142. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/loop_strategies.py +0 -0
  143. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/loop_sweep.py +0 -0
  144. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/metrics.py +0 -0
  145. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/models.py +0 -0
  146. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/monitor.py +0 -0
  147. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/__init__.py +0 -0
  148. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
  149. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
  150. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/litellm_config.py +0 -0
  151. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/litellm_logging.py +0 -0
  152. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/litellm_runtime.py +0 -0
  153. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/providers/runtime.py +0 -0
  154. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/publish/__init__.py +0 -0
  155. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/publish/huggingface.py +0 -0
  156. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/py.typed +0 -0
  157. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/__init__.py +0 -0
  158. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/config.py +0 -0
  159. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/default-rubric.json +0 -0
  160. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/prompts.py +0 -0
  161. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/runner.py +0 -0
  162. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/review/wrapper.py +0 -0
  163. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/README.md +0 -0
  164. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/__init__.py +0 -0
  165. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/builtins.py +0 -0
  166. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/events.py +0 -0
  167. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/file_readers.py +0 -0
  168. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/llm.py +0 -0
  169. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/memory_scorer.py +0 -0
  170. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/node.py +0 -0
  171. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/protocol.py +0 -0
  172. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/rubric.py +0 -0
  173. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/rubric_config.py +0 -0
  174. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rewards/validation.py +0 -0
  175. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_config.py +0 -0
  176. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_deadline.py +0 -0
  177. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_results.py +0 -0
  178. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_setup.py +0 -0
  179. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_skills.py +0 -0
  180. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_usage.py +0 -0
  181. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/_user_loop.py +0 -0
  182. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/session_factory_runtime.py +0 -0
  183. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout/task_runtime.py +0 -0
  184. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout_branch.py +0 -0
  185. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/rollout_planes.py +0 -0
  186. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/runtime.py +0 -0
  187. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/__init__.py +0 -0
  188. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_base.py +0 -0
  189. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
  190. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_compose.py +0 -0
  191. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
  192. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
  193. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
  194. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
  195. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/_sdk_ops.py +0 -0
  196. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore.py +0 -0
  197. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore_builder.py +0 -0
  198. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore_image.py +0 -0
  199. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
  200. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
  201. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
  202. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/apple_container.py +0 -0
  203. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/daytona.py +0 -0
  204. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/daytona_dind.py +0 -0
  205. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/daytona_pty.py +0 -0
  206. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/daytona_reaper.py +0 -0
  207. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/daytona_strategies.py +0 -0
  208. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/docker.py +0 -0
  209. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/lockdown.py +0 -0
  210. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/metadata.py +0 -0
  211. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/modal_impl.py +0 -0
  212. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/__init__.py +0 -0
  213. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/_base.py +0 -0
  214. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/agentcore.py +0 -0
  215. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/apple.py +0 -0
  216. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/daytona.py +0 -0
  217. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/process/docker.py +0 -0
  218. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/protocol.py +0 -0
  219. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/providers.py +0 -0
  220. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/services.py +0 -0
  221. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/setup.py +0 -0
  222. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/snapshot.py +0 -0
  223. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sandbox/user.py +0 -0
  224. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/scenes.py +0 -0
  225. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/sdk.py +0 -0
  226. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/self_gen.py +0 -0
  227. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skill_eval/__init__.py +0 -0
  228. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skill_eval/_core.py +0 -0
  229. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skill_eval/gepa_export.py +0 -0
  230. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skill_eval/schema.py +0 -0
  231. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skill_policy.py +0 -0
  232. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/skills.py +0 -0
  233. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/__init__.py +0 -0
  234. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/_document_evidence.py +0 -0
  235. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/_document_normalize.py +0 -0
  236. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/_document_parse.py +0 -0
  237. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/_document_profiles.py +0 -0
  238. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/acceptance_live.py +0 -0
  239. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/acceptance_live_model.py +0 -0
  240. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/acceptance_live_report.py +0 -0
  241. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/acceptance_live_validation.py +0 -0
  242. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/config.py +0 -0
  243. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/discovery.py +0 -0
  244. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/document.py +0 -0
  245. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/env.py +0 -0
  246. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/export.py +0 -0
  247. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/imports.py +0 -0
  248. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/output_format.py +0 -0
  249. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/package.py +0 -0
  250. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/paths.py +0 -0
  251. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/prompts.py +0 -0
  252. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/runtime_capabilities.py +0 -0
  253. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/runtime_view.py +0 -0
  254. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/task.py +0 -0
  255. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier.py +0 -0
  256. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_core.py +0 -0
  257. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_document.py +0 -0
  258. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_errors.py +0 -0
  259. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_judge_inputs.py +0 -0
  260. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_ors_episode.py +0 -0
  261. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_reward_kit.py +0 -0
  262. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_scan.py +0 -0
  263. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/task/verifier_script_strategy.py +0 -0
  264. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/templates/__init__.py +0 -0
  265. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/templates/judge.py.tmpl +0 -0
  266. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/templates/test.sh.tmpl +0 -0
  267. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/__init__.py +0 -0
  268. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/huggingface.py +0 -0
  269. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/local.py +0 -0
  270. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/models.py +0 -0
  271. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/parsers.py +0 -0
  272. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/traces/task_gen.py +0 -0
  273. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/training/__init__.py +0 -0
  274. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/training/backends/__init__.py +0 -0
  275. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/training/backends/prime_rl.py +0 -0
  276. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/training/run_manifest.py +0 -0
  277. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/__init__.py +0 -0
  278. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/_capture.py +0 -0
  279. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/_export_common.py +0 -0
  280. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/_llm_capture.py +0 -0
  281. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/call_purpose.py +0 -0
  282. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/export.py +0 -0
  283. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/export_adp.py +0 -0
  284. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/export_atif.py +0 -0
  285. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/export_prime_sft.py +0 -0
  286. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/export_trl_sft.py +0 -0
  287. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/metrics.py +0 -0
  288. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/results.py +0 -0
  289. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/tree.py +0 -0
  290. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
  291. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/types.py +0 -0
  292. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/trajectories/viewer.py +0 -0
  293. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/src/benchflow/usage_tracking.py +0 -0
  294. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/__init__.py +0 -0
  295. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/acceptance_live_harness.py +0 -0
  296. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/__init__.py +0 -0
  297. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_manifest_dirscan.py +0 -0
  298. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_manifest_loader.py +0 -0
  299. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_manifest_parity.py +0 -0
  300. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_manifest_wiring.py +0 -0
  301. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_namespace_shorthand.py +0 -0
  302. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_plugin_entry_points.py +0 -0
  303. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_protocol.py +0 -0
  304. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/agents/test_remote_manifest_autoload.py +0 -0
  305. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/README.md +0 -0
  306. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
  307. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
  308. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
  309. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/instruction.md +0 -0
  310. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
  311. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/task.md +0 -0
  312. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/task.toml +0 -0
  313. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/acp_smoke/tests/test.sh +0 -0
  314. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/conformance-results.json +0 -0
  315. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/proof_multi_agent.py +0 -0
  316. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/proof_snapshot.py +0 -0
  317. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/run_conformance.py +0 -0
  318. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
  319. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/conftest.py +0 -0
  320. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/__init__.py +0 -0
  321. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/_helpers.py +0 -0
  322. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/test_batch.py +0 -0
  323. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/test_orchestrator.py +0 -0
  324. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/test_replay_proxy.py +0 -0
  325. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/continue_run/test_run_folder.py +0 -0
  326. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/__init__.py +0 -0
  327. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_chibench_manifest.py +0 -0
  328. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_clawsbench_manifest.py +0 -0
  329. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_manifest.py +0 -0
  330. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_manifest_env.py +0 -0
  331. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_protocol.py +0 -0
  332. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/environment/test_readiness.py +0 -0
  333. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
  334. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/instruction.md +0 -0
  335. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/solution/solve.sh +0 -0
  336. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/task.md +0 -0
  337. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/task.toml +0 -0
  338. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/hello-world-task/tests/test.sh +0 -0
  339. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/test_claude.sh +0 -0
  340. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/test_codex.sh +0 -0
  341. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/test_codex_custom_provider.sh +0 -0
  342. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/test_gemini.sh +0 -0
  343. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/test_openclaw.sh +0 -0
  344. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/traces/minimal-claude.jsonl +0 -0
  345. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
  346. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/README.md +0 -0
  347. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
  348. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
  349. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/alpha-task/task.toml +0 -0
  350. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
  351. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
  352. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
  353. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/beta-task/instruction.md +0 -0
  354. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/beta-task/task.toml +0 -0
  355. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
  356. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/mock_acp_agent.py +0 -0
  357. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
  358. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
  359. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/mock_openai_responses_server.py +0 -0
  360. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
  361. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
  362. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
  363. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
  364. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
  365. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
  366. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
  367. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
  368. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
  369. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
  370. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
  371. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
  372. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
  373. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
  374. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
  375. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
  376. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
  377. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
  378. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
  379. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
  380. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
  381. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
  382. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
  383. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
  384. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
  385. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
  386. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
  387. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
  388. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
  389. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
  390. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
  391. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
  392. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
  393. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
  394. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
  395. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
  396. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
  397. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
  398. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
  399. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
  400. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
  401. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
  402. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
  403. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
  404. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
  405. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
  406. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
  407. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
  408. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
  409. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
  410. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
  411. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
  412. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
  413. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
  414. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
  415. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
  416. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
  417. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
  418. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
  419. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
  420. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/_consistency.py +0 -0
  421. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/agent_judge.py +0 -0
  422. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/check_adapter_evidence.py +0 -0
  423. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/check_hosted_env_evidence.py +0 -0
  424. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/check_results.py +0 -0
  425. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
  426. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/check_trace_to_task_evidence.py +0 -0
  427. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/claude-agent-acp.yaml +0 -0
  428. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/codex-acp.yaml +0 -0
  429. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/gemini.yaml +0 -0
  430. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
  431. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/mimo.yaml +0 -0
  432. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/openclaw.yaml +0 -0
  433. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/opencode.yaml +0 -0
  434. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/openhands.yaml +0 -0
  435. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/configs/pi-acp.yaml +0 -0
  436. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/deepagents_harness.py +0 -0
  437. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/rubric_checks.py +0 -0
  438. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/run.sh +0 -0
  439. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/run_suite.py +0 -0
  440. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/scenarios.py +0 -0
  441. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/integration/suites/release.yaml +0 -0
  442. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acceptance_evidence.py +0 -0
  443. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acceptance_live.py +0 -0
  444. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acceptance_live_execution.py +0 -0
  445. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp.py +0 -0
  446. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp_capability_advertising.py +0 -0
  447. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp_mcp_servers.py +0 -0
  448. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp_model_config_dispatch.py +0 -0
  449. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp_pinned_protocol_guard.py +0 -0
  450. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_acp_setup_failure_propagation.py +0 -0
  451. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_adapter_scripts.py +0 -0
  452. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_adapters.py +0 -0
  453. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_cli.py +0 -0
  454. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_env_resolution.py +0 -0
  455. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_gemini_defaults.py +0 -0
  456. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_idle_timeout_cli.py +0 -0
  457. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_model_decouple.py +0 -0
  458. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_registry.py +0 -0
  459. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_router.py +0 -0
  460. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_router_cli_e2e.py +0 -0
  461. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_router_scaffold.py +0 -0
  462. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_setup.py +0 -0
  463. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agent_spec.py +0 -0
  464. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agentcore_builder.py +0 -0
  465. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agentcore_parallel.py +0 -0
  466. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agentcore_reaper.py +0 -0
  467. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agentcore_sandbox.py +0 -0
  468. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_agentcore_transport.py +0 -0
  469. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_api_error_capture.py +0 -0
  470. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_apple_container_sandbox.py +0 -0
  471. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_bare_model_provider.py +0 -0
  472. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_base_install_imports.py +0 -0
  473. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_bedrock_thinking.py +0 -0
  474. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_benchflow_experiment_review_validator.py +0 -0
  475. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
  476. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_branch.py +0 -0
  477. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_build_context_stage.py +0 -0
  478. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_build_review_pack.py +0 -0
  479. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_capture_trajectory.py +0 -0
  480. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_check_skillsbench_harbor_parity.py +0 -0
  481. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_clawsbench_slice.py +0 -0
  482. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_adopt_aliases.py +0 -0
  483. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_arg_validation.py +0 -0
  484. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_daytona.py +0 -0
  485. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_docs_drift.py +0 -0
  486. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_edge_case_hardening.py +0 -0
  487. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_hub_env.py +0 -0
  488. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_cli_misc.py +0 -0
  489. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_codex_review.py +0 -0
  490. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_codex_self_write_auth.py +0 -0
  491. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_config_override.py +0 -0
  492. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_config_redaction.py +0 -0
  493. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_connect_as_env.py +0 -0
  494. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_console_error_truncation.py +0 -0
  495. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_continuallearningbench_adapter.py +0 -0
  496. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_dataset_registry.py +0 -0
  497. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_command_polling.py +0 -0
  498. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_dind_compose_up.py +0 -0
  499. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_download.py +0 -0
  500. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_litellm_runtime.py +0 -0
  501. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_poll_deadline.py +0 -0
  502. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_daytona_reap.py +0 -0
  503. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_deepagents_agent.py +0 -0
  504. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_docker_prune_scoping.py +0 -0
  505. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_docker_uploads.py +0 -0
  506. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_docs_examples.py +0 -0
  507. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eng50_capabilities.py +0 -0
  508. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_env_registry.py +0 -0
  509. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_env_setup.py +0 -0
  510. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_environment_manifest_controls.py +0 -0
  511. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_artifact_cli.py +0 -0
  512. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_filters_applied.py +0 -0
  513. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_lift.py +0 -0
  514. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_sharding.py +0 -0
  515. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_single_task_summary.py +0 -0
  516. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_source_provenance.py +0 -0
  517. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_worker_retry.py +0 -0
  518. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_eval_zero_task_guard.py +0 -0
  519. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_evaluation_environment_manifest.py +0 -0
  520. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_exclude_tasks.py +0 -0
  521. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_filter_credentialed_cells.py +0 -0
  522. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_harvey_lab_shim.py +0 -0
  523. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_hilbench_adapter.py +0 -0
  524. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_hosted_env.py +0 -0
  525. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_hosted_env_rollout_contract.py +0 -0
  526. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_hub_harbor_registry.py +0 -0
  527. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_inbound_adapter_manifest.py +0 -0
  528. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_inbound_adapters.py +0 -0
  529. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_agent_judge.py +0 -0
  530. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_check_results.py +0 -0
  531. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_consistency.py +0 -0
  532. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_matrix.py +0 -0
  533. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_provider_selection.py +0 -0
  534. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_run_suite.py +0 -0
  535. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_integration_suite.py +0 -0
  536. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_internet_policy.py +0 -0
  537. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_job.py +0 -0
  538. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_job_sequential_shared.py +0 -0
  539. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_job_sequential_shared_resume.py +0 -0
  540. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_judge_robustness.py +0 -0
  541. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_judge_symlink_ingestion.py +0 -0
  542. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_learner_skills.py +0 -0
  543. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_learner_skills_traversal.py +0 -0
  544. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_learner_store.py +0 -0
  545. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_learner_store_persistence.py +0 -0
  546. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_config.py +0 -0
  547. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_hardening.py +0 -0
  548. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_logging.py +0 -0
  549. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_model_via_env_generic.py +0 -0
  550. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_reasoning_passthrough.py +0 -0
  551. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_runtime.py +0 -0
  552. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_litellm_smoke.py +0 -0
  553. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_live_llm_trajectory.py +0 -0
  554. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_llm_judge.py +0 -0
  555. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_llm_judge_event_tags.py +0 -0
  556. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_llm_judge_verifier.py +0 -0
  557. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_loop_strategies.py +0 -0
  558. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_loop_summary.py +0 -0
  559. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_loop_sweep.py +0 -0
  560. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_memory_scorer.py +0 -0
  561. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_metrics.py +0 -0
  562. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_mle_bench_adapter.py +0 -0
  563. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_mock_openai_responses_server.py +0 -0
  564. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_monitor_scaffold.py +0 -0
  565. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_native_acp_usage.py +0 -0
  566. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_no_cross_provider_fallback.py +0 -0
  567. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_notification_order_real.py +0 -0
  568. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_opencode_family_proxy_tracking.py +0 -0
  569. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_oracle.py +0 -0
  570. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_oracle_chokepoint.py +0 -0
  571. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_paths_safe.py +0 -0
  572. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_paths_symlink_helpers.py +0 -0
  573. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_pi_acp_launcher.py +0 -0
  574. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_pi_acp_proxy_routing.py +0 -0
  575. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_process.py +0 -0
  576. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_project_skills_layout.py +0 -0
  577. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_provider_auth_detection.py +0 -0
  578. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_providers.py +0 -0
  579. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_reexport.py +0 -0
  580. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_registry_invariants.py +0 -0
  581. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_release_hardening_r5.py +0 -0
  582. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_release_version.py +0 -0
  583. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_release_workflow_wiring.py +0 -0
  584. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_resolve_env_helpers.py +0 -0
  585. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_review_boundaries.py +0 -0
  586. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_review_rubric.py +0 -0
  587. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_review_runtime.py +0 -0
  588. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_reward_lenient.py +0 -0
  589. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_reward_node.py +0 -0
  590. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_reward_range.py +0 -0
  591. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_reward_unified_contract.py +0 -0
  592. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rewards.py +0 -0
  593. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rewards_jsonl.py +0 -0
  594. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_architecture.py +0 -0
  595. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_branch.py +0 -0
  596. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_config_path_coercion.py +0 -0
  597. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_environment.py +0 -0
  598. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_hard_deadline.py +0 -0
  599. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_import_no_side_effects.py +0 -0
  600. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_on_ask_user_wiring.py +0 -0
  601. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_planes_contract.py +0 -0
  602. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_probe_sandbox_health.py +0 -0
  603. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_session_factory_dispatch.py +0 -0
  604. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_setup_commands.py +0 -0
  605. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rollout_upload.py +0 -0
  606. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rubric_checks.py +0 -0
  607. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_rubric_config.py +0 -0
  608. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_runtime.py +0 -0
  609. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_runtime_capabilities.py +0 -0
  610. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_runtime_config_wired.py +0 -0
  611. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_runtime_live_sandbox.py +0 -0
  612. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox.py +0 -0
  613. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_exec_secret_handling.py +0 -0
  614. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_hardening.py +0 -0
  615. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
  616. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_live_process.py +0 -0
  617. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_multi_service.py +0 -0
  618. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_prebuilt_validation.py +0 -0
  619. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_protocol.py +0 -0
  620. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_provider_registry_drift.py +0 -0
  621. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_setup.py +0 -0
  622. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_snapshot_contract.py +0 -0
  623. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_upload_symlink.py +0 -0
  624. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sandbox_verifier_workspace.py +0 -0
  625. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_scene.py +0 -0
  626. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_scene_outbox_trial.py +0 -0
  627. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_scene_parallel_group.py +0 -0
  628. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_scene_result_aggregation.py +0 -0
  629. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_scoring.py +0 -0
  630. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sdk_internals.py +0 -0
  631. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sdk_lockdown.py +0 -0
  632. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sdk_run_alias.py +0 -0
  633. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_sealed_channel_container.py +0 -0
  634. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_self_gen_cli.py +0 -0
  635. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_self_gen_export_error_channel.py +0 -0
  636. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_self_gen_export_failures.py +0 -0
  637. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_self_gen_orchestration.py +0 -0
  638. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_session_factory_runtime.py +0 -0
  639. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_session_request_permission_dispatch.py +0 -0
  640. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_eval.py +0 -0
  641. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_eval_dryrun.py +0 -0
  642. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_eval_integration.py +0 -0
  643. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_eval_sweep.py +0 -0
  644. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_eval_traversal.py +0 -0
  645. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_invocation_artifacts.py +0 -0
  646. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skill_policy.py +0 -0
  647. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skills.py +0 -0
  648. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skills_dir_agent_home_link.py +0 -0
  649. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skillsbench_conversion_conformance.py +0 -0
  650. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_skillsbench_harbor_run_suite.py +0 -0
  651. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_smoke.py +0 -0
  652. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_smoke_wiring.py +0 -0
  653. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_source_adapters.py +0 -0
  654. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_subscription_auth.py +0 -0
  655. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_check_eval_consistency.py +0 -0
  656. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_config.py +0 -0
  657. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_digest.py +0 -0
  658. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_document.py +0 -0
  659. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_download.py +0 -0
  660. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_export.py +0 -0
  661. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_output_format.py +0 -0
  662. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_package.py +0 -0
  663. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_task_runtime_primitive.py +0 -0
  664. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_tasks.py +0 -0
  665. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_token_usage_normalization.py +0 -0
  666. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trace_import_cli.py +0 -0
  667. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trace_task_gen_traversal.py +0 -0
  668. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trace_to_task_evidence.py +0 -0
  669. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_traces_huggingface.py +0 -0
  670. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_traces_parsers.py +0 -0
  671. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_traces_task_gen.py +0 -0
  672. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_train_cli.py +0 -0
  673. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_train_mode_artifact_emission.py +0 -0
  674. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_train_trl_cli.py +0 -0
  675. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trajectory_integration.py +0 -0
  676. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trajectory_streaming.py +0 -0
  677. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trial_agent_timeout_verify.py +0 -0
  678. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trial_install_agent_timeout.py +0 -0
  679. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trial_litellm_runtime.py +0 -0
  680. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_trl_integration.py +0 -0
  681. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_usage_litellm.py +0 -0
  682. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_usage_required.py +0 -0
  683. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_usage_tracking.py +0 -0
  684. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_user.py +0 -0
  685. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_v06_guard_ports.py +0 -0
  686. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_document.py +0 -0
  687. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_multi_container.py +0 -0
  688. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_output.py +0 -0
  689. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_output_freshness.py +0 -0
  690. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_strategies.py +0 -0
  691. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verifier_wedge_retry.py +0 -0
  692. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_verify.py +0 -0
  693. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_workflow_action_pinning.py +0 -0
  694. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/test_yaml_config.py +0 -0
  695. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/__init__.py +0 -0
  696. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export.py +0 -0
  697. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export_adp.py +0 -0
  698. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export_atif.py +0 -0
  699. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export_common.py +0 -0
  700. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export_nan_handling.py +0 -0
  701. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_export_prime_sft.py +0 -0
  702. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_redaction.py +0 -0
  703. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/tests/trajectories/test_step_granularity.py +0 -0
  704. {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1843}/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.dev1840
3
+ Version: 0.6.7.dev1843
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.dev1840"
3
+ version = "0.6.7.dev1843"
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", {})
@@ -4,27 +4,32 @@ The one file-touching corner of the CLI's final report block: when a failed
4
4
  task's reason would otherwise be the bare ``reward X`` fallback, mine the
5
5
  rollout's verifier artifacts for a one-line explanation. Lives in its own
6
6
  module so ``cli/_shared.py`` stays the side-effect-free display helpers it
7
- advertises.
7
+ advertises. Also home of :func:`metric_breakdown`, the one canonical
8
+ rewards-dict flattening — shared by ``_shared.py``'s in-memory metric tier and
9
+ the ``reward.json`` probe here, so the two render identically.
8
10
 
9
11
  Contract (the engine stays file-free — these reads are CLI-side, report-time
10
12
  only):
11
13
 
12
14
  - The rollout dir is resolved exactly, from the ``rollout_name`` the engine
13
15
  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
+ - Evidence sources are tried in order (CTRF report, then reward.json metric
17
+ breakdown, then test-stdout tail); the first that yields a line wins.
16
18
  - Every read is bounded (``_ARTIFACT_READ_BYTES`` per file) and nothing here
17
19
  raises — any surprise degrades to ``None``, i.e. the bare reward reason.
20
+ - The report block's ``(details: …)`` pointer is decided separately, by
21
+ :func:`verifier_dir_for` from dir existence alone — every failure block
22
+ with artifacts on disk gets one pointer, evidence or not.
18
23
  """
19
24
 
20
25
  from __future__ import annotations
21
26
 
22
27
  import json
23
28
  import re
24
- from typing import TYPE_CHECKING, NamedTuple
29
+ from typing import TYPE_CHECKING, Any, NamedTuple
25
30
 
26
31
  if TYPE_CHECKING:
27
- from collections.abc import Callable
32
+ from collections.abc import Callable, Mapping
28
33
  from pathlib import Path
29
34
 
30
35
  # Never read more than this many bytes per file, and evidence is only mined
@@ -32,6 +37,8 @@ if TYPE_CHECKING:
32
37
  _ARTIFACT_READ_BYTES = 64 * 1024
33
38
  # Pytest final summary, decoration stripped: "1 failed, 2 passed in 40.86s".
34
39
  _PYTEST_SUMMARY_RE = re.compile(r"\d+ failed\b")
40
+ # Metric-breakdown cap: one metric-happy verifier can't flood the line.
41
+ _BREAKDOWN_METRICS = 3
35
42
 
36
43
 
37
44
  class FailureLine(NamedTuple):
@@ -49,6 +56,88 @@ class FailureLine(NamedTuple):
49
56
  suffix: str = ""
50
57
 
51
58
 
59
+ def _numeric_items(mapping: Mapping[str, Any]) -> list[tuple[str, Any]]:
60
+ """The named numeric metrics of one mapping level, insertion-ordered.
61
+
62
+ ``reward`` is excluded at every level: at the top it is the aggregate the
63
+ line already leads with, and a nested ``reward`` would render a confusing
64
+ ``reward 0.8 — reward 0.8``.
65
+ """
66
+ return [
67
+ (name, value)
68
+ for name, value in mapping.items()
69
+ if name != "reward" and isinstance(value, (bool, int, float))
70
+ ]
71
+
72
+
73
+ def metric_breakdown(rewards: Mapping[str, Any]) -> str | None:
74
+ """Compact ``name value`` metric breakdown of a rewards mapping, capped at
75
+ ``_BREAKDOWN_METRICS`` — or ``None`` when it holds no named metrics.
76
+
77
+ The numeric evidence may sit flat in the mapping, or nested one level under
78
+ a ``metrics`` sub-dict (env0-style verifiers: ``{"reward": …, "metrics":
79
+ {…}, "details": {…}}``), or under ``details`` when ``metrics`` yields
80
+ nothing. Flat keys win outright — a flat rewards dict renders exactly as
81
+ before.
82
+
83
+ Ordering leads with the lowest-signal metrics — they explain the miss:
84
+
85
+ - A ``<name>_found`` metric with a matching positive numeric
86
+ ``<name>_total`` anywhere in the mapping renders as ``<name> found/total``
87
+ and sorts by that fraction, so ``deadlines 1/5`` leads even though 1 is
88
+ not 0. A total consumed by a pair is dropped from the shown list (the
89
+ fraction already carries it).
90
+ - Unpaired metrics keep the zero-first rule: zero/failed first, stable
91
+ within each group.
92
+ """
93
+ shown = _numeric_items(rewards)
94
+ if not shown:
95
+ for key in ("metrics", "details"):
96
+ sub = rewards.get(key)
97
+ if isinstance(sub, dict):
98
+ shown = _numeric_items(sub)
99
+ if shown:
100
+ break
101
+ if not shown:
102
+ return None
103
+ # found/total pairing looks across ALL levels: env0 keeps the found counts
104
+ # under "metrics" and the totals under "details". First-seen wins.
105
+ totals: dict[str, Any] = {}
106
+ for source in (rewards, rewards.get("metrics"), rewards.get("details")):
107
+ if isinstance(source, dict):
108
+ for name, value in _numeric_items(source):
109
+ totals.setdefault(name, value)
110
+
111
+ def _pair_total(name: str, value: Any) -> Any | None:
112
+ """The positive numeric ``<base>_total`` for a ``<base>_found`` metric,
113
+ else ``None``. Bools (either side) and non-positive totals never pair."""
114
+ base = name.removesuffix("_found")
115
+ if base == name or isinstance(value, bool):
116
+ return None
117
+ total = totals.get(base + "_total")
118
+ if isinstance(total, bool) or not isinstance(total, (int, float)):
119
+ return None
120
+ return total if total > 0 else None
121
+
122
+ consumed = {
123
+ name.removesuffix("_found") + "_total"
124
+ for name, value in shown
125
+ if _pair_total(name, value) is not None
126
+ }
127
+ entries: list[tuple[float, str]] = []
128
+ for name, value in shown:
129
+ if name in consumed:
130
+ continue
131
+ total = _pair_total(name, value)
132
+ if total is not None:
133
+ base = name.removesuffix("_found")
134
+ entries.append((value / total, f"{base} {value}/{total}"))
135
+ else:
136
+ entries.append((0.0 if value == 0 else 1.0, f"{name} {value}"))
137
+ entries.sort(key=lambda entry: entry[0]) # stable: ties keep dict order
138
+ return ", ".join(fragment for _, fragment in entries[:_BREAKDOWN_METRICS])
139
+
140
+
52
141
  def _display_test_name(raw_name: str) -> str:
53
142
  """Test name for display: node-id path segments dropped, param id kept.
54
143
 
@@ -65,6 +154,19 @@ def _display_test_name(raw_name: str) -> str:
65
154
  return head.rsplit("::", 1)[-1] + bracket + param
66
155
 
67
156
 
157
+ def _bounded_json(path: Path) -> dict[str, Any] | None:
158
+ """The file parsed as a JSON object, or ``None`` when it can't serve.
159
+
160
+ JSON only parses whole — an oversized (> ``_ARTIFACT_READ_BYTES``) file is
161
+ skipped, not truncated, and a non-object payload is skipped the same way;
162
+ either way the next evidence source gets its turn.
163
+ """
164
+ if path.stat().st_size > _ARTIFACT_READ_BYTES:
165
+ return None
166
+ data = json.loads(path.read_text(encoding="utf-8", errors="replace"))
167
+ return data if isinstance(data, dict) else None
168
+
169
+
68
170
  def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
69
171
  """``<test> failed[: <assertion>]`` from the first failed CTRF test.
70
172
 
@@ -76,11 +178,9 @@ def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
76
178
  carries a count suffix (``(+N more failures; P/T checks passed)``) so the
77
179
  console never under-reports how much is broken.
78
180
  """
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.
181
+ data = _bounded_json(ctrf_path)
182
+ if data is None:
82
183
  return None
83
- data = json.loads(ctrf_path.read_text(encoding="utf-8", errors="replace"))
84
184
  raw_tests = (data.get("results") or {}).get("tests") or []
85
185
  tests = [test for test in raw_tests if isinstance(test, dict)]
86
186
  failed = [test for test in tests if test.get("status") == "failed"]
@@ -115,6 +215,25 @@ def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
115
215
  return FailureLine(f"{name} failed", suffix)
116
216
 
117
217
 
218
+ def _reward_json_failure_line(reward_path: Path) -> FailureLine | None:
219
+ """Metric breakdown mined from the verifier's ``reward.json``.
220
+
221
+ env0-style verifiers write ``{"reward": …, "metrics": {…}, "details":
222
+ {…}}`` (and non-pytest stdout, no CTRF report) — when the result's rewards
223
+ dict was stripped to the bare aggregate (older persisted results, sharded
224
+ aggregation), the numeric evidence still sits on disk. Reuses the same
225
+ one-level flattening as the in-memory reward-dict tier so the two render
226
+ identically. A file with no named metrics repeats nothing the line does
227
+ not already say — it yields to the stdout tail. No count suffix: the
228
+ breakdown is a metric summary, not a first-of-N failure pick.
229
+ """
230
+ data = _bounded_json(reward_path)
231
+ if data is None:
232
+ return None
233
+ shown = metric_breakdown(data)
234
+ return FailureLine(shown) if shown is not None else None
235
+
236
+
118
237
  def _stdout_tail_failure_line(stdout_path: Path) -> FailureLine | None:
119
238
  """Last pytest summary ("N failed, M passed …") — else last ``FAILED …``
120
239
  line — from a bounded tail of the verifier's test-stdout capture. No count
@@ -133,13 +252,28 @@ def _stdout_tail_failure_line(stdout_path: Path) -> FailureLine | None:
133
252
  return FailureLine(last_failed) if last_failed is not None else None
134
253
 
135
254
 
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``.
255
+ def verifier_dir_for(job_dir: Path, rollout_name: str) -> Path | None:
256
+ """The rollout's verifier dir when it exists on disk, else ``None``.
257
+
258
+ Powers the report block's ``(details: …)`` pointer rule: every failure
259
+ block with artifacts on disk gets one pointer — from dir existence alone,
260
+ independent of which tier supplied the reason line (the pointer is most
261
+ valuable exactly when evidence extraction fails). Never raises.
262
+ """
263
+ # Local import: RolloutPaths pulls in the task package (see
264
+ # artifact_failure_evidence).
265
+ from benchflow.task.paths import RolloutPaths
266
+
267
+ try:
268
+ verifier_dir = RolloutPaths(rollout_dir=job_dir / rollout_name).verifier_dir
269
+ return verifier_dir if verifier_dir.is_dir() else None
270
+ except Exception:
271
+ return None
272
+
140
273
 
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.
274
+ def artifact_failure_evidence(job_dir: Path, rollout_name: str) -> FailureLine | None:
275
+ """``FailureLine`` mined from the rollout's verifier artifacts, or ``None``
276
+ when every probe misses. Never raises.
143
277
  """
144
278
  # Local import: RolloutPaths pulls in the task package, which the CLI
145
279
  # shouldn't pay for until a failure actually needs artifact evidence.
@@ -151,6 +285,7 @@ def artifact_failure_evidence(
151
285
  # ctrf.json has no RolloutPaths property — the verifier recovers it by
152
286
  # literal name (verifier_core.py, `_recover_main_verifier_outputs`).
153
287
  (verifier_dir / "ctrf.json", _ctrf_failure_line),
288
+ (rollout_paths.reward_json_path, _reward_json_failure_line),
154
289
  (rollout_paths.test_stdout_path, _stdout_tail_failure_line),
155
290
  ]
156
291
  for path, extract in attempts:
@@ -163,5 +298,5 @@ def artifact_failure_evidence(
163
298
  # the report must never crash over evidence mining.
164
299
  continue
165
300
  if detail is not None:
166
- return detail, verifier_dir
301
+ return detail
167
302
  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,12 @@ 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 FailureLine, artifact_failure_evidence
24
+ from benchflow.cli._failure_evidence import (
25
+ FailureLine,
26
+ artifact_failure_evidence,
27
+ metric_breakdown,
28
+ verifier_dir_for,
29
+ )
25
30
 
26
31
  if TYPE_CHECKING:
27
32
  from pathlib import Path
@@ -110,55 +115,38 @@ def _exit_if_evaluation_had_errors(result: object) -> None:
110
115
  # count suffix, which deliberately run ~40 chars past the budget.
111
116
  _MAX_FAILURE_LINES = 5
112
117
  _FAILURE_LINE_LIMIT = 100
113
- _FAILURE_REASON_METRICS = 3
114
118
 
115
119
 
116
- def _failure_reason(
117
- failure: TaskFailure, job_dir: Path | None = None
118
- ) -> tuple[FailureLine, Path | None]:
119
- """One cheap line explaining why a FAILED (scored, reward != 1) task
120
- failed, plus the verifier dir when artifacts supplied the evidence.
120
+ def _failure_reason(failure: TaskFailure, job_dir: Path | None = None) -> FailureLine:
121
+ """One cheap line explaining why a FAILED (scored, reward != 1) task failed.
121
122
 
122
123
  Priority: the verifier's own error if set; else the reward plus a compact
123
- breakdown of the named metrics in the reward dict (zero/failed metrics
124
- first they explain the miss); else the reward plus a one-liner mined
125
- from the rollout's verifier artifacts (bounded CLI-side reads resolved via
126
- the ``rollout_name`` the engine records the engine stays file-free);
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.
124
+ breakdown of the named metrics in the reward dict flat, or flattened one
125
+ level from an env0-style ``metrics``/``details`` sub-dict, lowest-signal
126
+ metrics first (see :func:`metric_breakdown`); else the reward plus a
127
+ one-liner mined from the rollout's verifier artifacts (bounded CLI-side
128
+ reads resolved via the ``rollout_name`` the engine records the engine
129
+ stays file-free); else just the reward. The reason is a ``FailureLine`` so
130
+ the artifact tier's multi-failure count suffix stays separable from the
131
+ truncatable body (only the artifact tier ever sets it). The block's
132
+ ``(details: …)`` pointer is NOT decided here — the caller keys it off
133
+ on-disk artifacts alone, independent of which tier supplied the reason.
132
134
  """
133
135
  if failure.verifier_error:
134
136
  # Collapse whitespace: verifier errors are routinely multi-line.
135
- return FailureLine(" ".join(failure.verifier_error.split())), None
137
+ return FailureLine(" ".join(failure.verifier_error.split()))
136
138
  rewards = failure.rewards or {}
137
139
  reward = rewards.get("reward")
138
- metrics = [
139
- (name, value)
140
- for name, value in rewards.items()
141
- if name != "reward" and isinstance(value, (bool, int, float))
142
- ]
143
- if metrics:
144
- # Zero/failed metrics first (stable within each group), capped so one
145
- # metric-happy verifier can't flood the line.
146
- metrics.sort(key=lambda kv: kv[1] != 0)
147
- shown = ", ".join(
148
- f"{name} {value}" for name, value in metrics[:_FAILURE_REASON_METRICS]
149
- )
150
- return FailureLine(f"reward {reward} — {shown}"), None
140
+ shown = metric_breakdown(rewards)
141
+ if shown is not None:
142
+ return FailureLine(f"reward {reward} {shown}")
151
143
  # No rollout_name (pre-#957-follow-up result.json, sharded aggregation):
152
144
  # nothing to resolve — the bare reward is as honest as it gets.
153
145
  if job_dir is not None and failure.rollout_name:
154
- evidence = artifact_failure_evidence(job_dir, failure.rollout_name)
155
- if evidence is not None:
156
- detail, verifier_dir = evidence
157
- return (
158
- FailureLine(f"reward {reward} — {detail.body}", detail.suffix),
159
- verifier_dir,
160
- )
161
- return FailureLine(f"reward {reward}"), None
146
+ detail = artifact_failure_evidence(job_dir, failure.rollout_name)
147
+ if detail is not None:
148
+ return FailureLine(f"reward {reward} — {detail.body}", detail.suffix)
149
+ return FailureLine(f"reward {reward}")
162
150
 
163
151
 
164
152
  def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -> None:
@@ -170,8 +158,9 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
170
158
  dim ``✗ task: reason`` line (capped at ``_MAX_FAILURE_LINES``) so the "why"
171
159
  doesn't require opening summary.json; when ``job_dir`` is given, a reason
172
160
  that would otherwise be a bare ``reward X`` is upgraded from the rollout's
173
- verifier artifacts (bounded reads, displayed failures only), with a single
174
- ``(details: …/verifier)`` pointer line for the block. When ``job_dir`` is
161
+ verifier artifacts (bounded reads, displayed failures only), and every
162
+ failure block with artifacts on disk gets one ``(details: …/verifier)``
163
+ pointer line — evidence mined or not. When ``job_dir`` is
175
164
  given, the result/summary paths are printed so testers know where to look
176
165
  (the guide repeatedly says "read summary.json" but the CLI never said
177
166
  where).
@@ -210,9 +199,14 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
210
199
  failures = getattr(result, "task_failures", None) or []
211
200
  artifact_pointer: Path | None = None
212
201
  for failure in failures[:_MAX_FAILURE_LINES]:
213
- reason, verifier_dir = _failure_reason(failure, job_dir)
214
- if artifact_pointer is None and verifier_dir is not None:
215
- artifact_pointer = verifier_dir
202
+ reason = _failure_reason(failure, job_dir)
203
+ # Pointer rule: every failure block with artifacts on disk gets one
204
+ # (details:) pointer — the first displayed failure whose verifier dir
205
+ # exists, independent of which tier supplied its reason line (byte-
206
+ # identical reasons must not differ on provenance the console can't
207
+ # show, and the pointer matters most when every probe missed).
208
+ if artifact_pointer is None and job_dir is not None and failure.rollout_name:
209
+ artifact_pointer = verifier_dir_for(job_dir, failure.rollout_name)
216
210
  # The char budget governs only the free-text body; the multi-failure
217
211
  # count suffix is appended AFTER truncation so a long assertion can
218
212
  # never swallow the "more than this is broken" signal. Worst case the
@@ -226,8 +220,9 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
226
220
  extra = len(failures) - _MAX_FAILURE_LINES
227
221
  if extra > 0:
228
222
  console.print(f"[dim] … and {extra} more[/dim]")
229
- # One pointer per block (not per line): the first artifact-backed reason's
230
- # verifier dir, so "where do I look next" needs no summary.json dig either.
223
+ # One pointer per block (not per line): the first displayed failure whose
224
+ # verifier dir exists — artifact-backed or not — so "where do I look next"
225
+ # needs no summary.json dig even when evidence mining came up empty.
231
226
  if artifact_pointer is not None:
232
227
  console.print(f"[dim] (details: {escape(str(artifact_pointer))})[/dim]")
233
228
  if job_dir is not None: