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