benchflow 0.5.3.dev978__tar.gz → 0.5.3.dev983__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 (427) hide show
  1. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/CHANGELOG.md +17 -0
  2. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/PKG-INFO +2 -2
  3. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/pyproject.toml +3 -2
  4. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/evaluation.py +15 -5
  5. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout.py +13 -4
  6. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_results.py +107 -1
  7. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dataset_registry.py +73 -24
  8. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_integration_check_results.py +254 -0
  9. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/.gitignore +0 -0
  10. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/LICENSE +0 -0
  11. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/README.md +0 -0
  12. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/__init__.py +0 -0
  13. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_dotenv.py +0 -0
  14. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_paths.py +0 -0
  15. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_run.py +0 -0
  16. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_types.py +0 -0
  17. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/__init__.py +0 -0
  18. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/benchmark_repos.py +0 -0
  19. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/config.py +0 -0
  20. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/dataset_registry.py +0 -0
  21. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/evaluation_results.py +0 -0
  22. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/json_safe.py +0 -0
  23. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/learner_memory.py +0 -0
  24. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/result_metadata.py +0 -0
  25. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/reward_events.py +0 -0
  26. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/scoring.py +0 -0
  27. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/source_provenance.py +0 -0
  28. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/task_authoring.py +0 -0
  29. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/yaml_loader.py +0 -0
  30. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/__init__.py +0 -0
  31. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/client.py +0 -0
  32. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/container_transport.py +0 -0
  33. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/runtime.py +0 -0
  34. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/session.py +0 -0
  35. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/transport.py +0 -0
  36. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/types.py +0 -0
  37. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/__init__.py +0 -0
  38. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/harbor.py +0 -0
  39. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/inbound.py +0 -0
  40. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/inspect_ai.py +0 -0
  41. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/ors.py +0 -0
  42. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/terminal_bench.py +0 -0
  43. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/__init__.py +0 -0
  44. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/codex_config.py +0 -0
  45. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/credentials.py +0 -0
  46. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/env.py +0 -0
  47. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/errors.py +0 -0
  48. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
  49. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/install.py +0 -0
  50. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
  51. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/pi_acp_launcher.py +0 -0
  52. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/protocol.py +0 -0
  53. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/providers.py +0 -0
  54. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/registry.py +0 -0
  55. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/branch.py +0 -0
  56. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/__init__.py +0 -0
  57. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/continue_cmd.py +0 -0
  58. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/main.py +0 -0
  59. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/trace_import.py +0 -0
  60. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/compat/__init__.py +0 -0
  61. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/compat/harbor_registry.py +0 -0
  62. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/__init__.py +0 -0
  63. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/batch.py +0 -0
  64. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/orchestrator.py +0 -0
  65. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/replay_proxy.py +0 -0
  66. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/run_folder.py +0 -0
  67. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
  68. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/__init__.py +0 -0
  69. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/planes.py +0 -0
  70. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/user.py +0 -0
  71. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/environment/Dockerfile +0 -0
  72. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/instruction.md +0 -0
  73. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/task.toml +0 -0
  74. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/tests/test.sh +0 -0
  75. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/diagnostics.py +0 -0
  76. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/__init__.py +0 -0
  77. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/manifest.py +0 -0
  78. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/manifest_env.py +0 -0
  79. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/protocol.py +0 -0
  80. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/readiness.py +0 -0
  81. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/eval_sharding.py +0 -0
  82. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/eval_worker.py +0 -0
  83. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/__init__.py +0 -0
  84. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/__init__.py +0 -0
  85. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/hooks.py +0 -0
  86. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
  87. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/hosted_env.py +0 -0
  88. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/learner_skills.py +0 -0
  89. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/learner_store.py +0 -0
  90. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/metrics.py +0 -0
  91. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/models.py +0 -0
  92. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/monitor.py +0 -0
  93. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/__init__.py +0 -0
  94. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
  95. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
  96. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_config.py +0 -0
  97. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_logging.py +0 -0
  98. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_runtime.py +0 -0
  99. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/runtime.py +0 -0
  100. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/py.typed +0 -0
  101. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/README.md +0 -0
  102. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/__init__.py +0 -0
  103. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/builtins.py +0 -0
  104. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/events.py +0 -0
  105. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/file_readers.py +0 -0
  106. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/llm.py +0 -0
  107. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/memory_scorer.py +0 -0
  108. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/node.py +0 -0
  109. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/protocol.py +0 -0
  110. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/rubric.py +0 -0
  111. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/rubric_config.py +0 -0
  112. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/validation.py +0 -0
  113. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout_branch.py +0 -0
  114. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout_planes.py +0 -0
  115. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/runtime.py +0 -0
  116. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/__init__.py +0 -0
  117. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_base.py +0 -0
  118. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
  119. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose.py +0 -0
  120. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
  121. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
  122. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
  123. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
  124. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_sdk_ops.py +0 -0
  125. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/daytona.py +0 -0
  126. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/docker.py +0 -0
  127. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/lockdown.py +0 -0
  128. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/metadata.py +0 -0
  129. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/modal_impl.py +0 -0
  130. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/process.py +0 -0
  131. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/protocol.py +0 -0
  132. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/services.py +0 -0
  133. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/setup.py +0 -0
  134. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/snapshot.py +0 -0
  135. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/user.py +0 -0
  136. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/scenes.py +0 -0
  137. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sdk.py +0 -0
  138. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/self_gen.py +0 -0
  139. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/__init__.py +0 -0
  140. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/_core.py +0 -0
  141. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/gepa_export.py +0 -0
  142. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/schema.py +0 -0
  143. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_policy.py +0 -0
  144. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skills.py +0 -0
  145. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/__init__.py +0 -0
  146. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/config.py +0 -0
  147. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/env.py +0 -0
  148. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/paths.py +0 -0
  149. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/task.py +0 -0
  150. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/verifier.py +0 -0
  151. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/__init__.py +0 -0
  152. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/judge.py.tmpl +0 -0
  153. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/test.sh.tmpl +0 -0
  154. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/__init__.py +0 -0
  155. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/huggingface.py +0 -0
  156. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/local.py +0 -0
  157. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/models.py +0 -0
  158. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/parsers.py +0 -0
  159. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/task_gen.py +0 -0
  160. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/__init__.py +0 -0
  161. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/_capture.py +0 -0
  162. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/export.py +0 -0
  163. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/metrics.py +0 -0
  164. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/otel.py +0 -0
  165. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/tree.py +0 -0
  166. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/types.py +0 -0
  167. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/viewer.py +0 -0
  168. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/usage_tracking.py +0 -0
  169. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/__init__.py +0 -0
  170. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/agents/__init__.py +0 -0
  171. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/agents/test_protocol.py +0 -0
  172. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/README.md +0 -0
  173. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
  174. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
  175. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
  176. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/instruction.md +0 -0
  177. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
  178. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/task.toml +0 -0
  179. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/tests/test.sh +0 -0
  180. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/conformance-results.json +0 -0
  181. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/proof_multi_agent.py +0 -0
  182. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/proof_snapshot.py +0 -0
  183. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/run_conformance.py +0 -0
  184. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
  185. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conftest.py +0 -0
  186. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/__init__.py +0 -0
  187. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/_helpers.py +0 -0
  188. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_batch.py +0 -0
  189. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_orchestrator.py +0 -0
  190. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_replay_proxy.py +0 -0
  191. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_run_folder.py +0 -0
  192. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/__init__.py +0 -0
  193. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_chibench_manifest.py +0 -0
  194. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_clawsbench_manifest.py +0 -0
  195. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_manifest.py +0 -0
  196. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_manifest_env.py +0 -0
  197. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_protocol.py +0 -0
  198. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_readiness.py +0 -0
  199. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
  200. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/instruction.md +0 -0
  201. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/solution/solve.sh +0 -0
  202. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/task.toml +0 -0
  203. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/tests/test.sh +0 -0
  204. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/environment/Dockerfile +0 -0
  205. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/instruction.md +0 -0
  206. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/solution/solve.sh +0 -0
  207. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/task.toml +0 -0
  208. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/tests/test.sh +0 -0
  209. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/tests/test_state.py +0 -0
  210. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_claude.sh +0 -0
  211. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_codex.sh +0 -0
  212. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_codex_custom_provider.sh +0 -0
  213. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_gemini.sh +0 -0
  214. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_openclaw.sh +0 -0
  215. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/traces/minimal-claude.jsonl +0 -0
  216. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
  217. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/README.md +0 -0
  218. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
  219. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
  220. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/task.toml +0 -0
  221. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
  222. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
  223. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
  224. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/instruction.md +0 -0
  225. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/task.toml +0 -0
  226. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
  227. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent.py +0 -0
  228. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
  229. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
  230. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_openai_responses_server.py +0 -0
  231. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_adapter_evidence.py +0 -0
  232. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_hosted_env_evidence.py +0 -0
  233. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
  234. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_trace_to_task_evidence.py +0 -0
  235. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/claude-agent-acp.yaml +0 -0
  236. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/codex-acp.yaml +0 -0
  237. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/gemini.yaml +0 -0
  238. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
  239. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/openclaw.yaml +0 -0
  240. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/opencode.yaml +0 -0
  241. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/openhands.yaml +0 -0
  242. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/pi-acp.yaml +0 -0
  243. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/run.sh +0 -0
  244. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/run_suite.py +0 -0
  245. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/suites/release.yaml +0 -0
  246. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp.py +0 -0
  247. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_capability_advertising.py +0 -0
  248. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_model_config_dispatch.py +0 -0
  249. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_pinned_protocol_guard.py +0 -0
  250. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_setup_failure_propagation.py +0 -0
  251. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_adapter_scripts.py +0 -0
  252. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_adapters.py +0 -0
  253. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_cli.py +0 -0
  254. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_env_resolution.py +0 -0
  255. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_gemini_defaults.py +0 -0
  256. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_idle_timeout_cli.py +0 -0
  257. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_model_decouple.py +0 -0
  258. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_registry.py +0 -0
  259. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_setup.py +0 -0
  260. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_spec.py +0 -0
  261. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_base_install_imports.py +0 -0
  262. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_bedrock_thinking.py +0 -0
  263. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_branch.py +0 -0
  264. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_capture_trajectory.py +0 -0
  265. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_clawsbench_slice.py +0 -0
  266. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_daytona.py +0 -0
  267. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_docs_drift.py +0 -0
  268. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_misc.py +0 -0
  269. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_compat_harbor_registry.py +0 -0
  270. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_config_redaction.py +0 -0
  271. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_connect_as_env.py +0 -0
  272. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_continuallearningbench_adapter.py +0 -0
  273. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_credential_env_scrub.py +0 -0
  274. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_daytona_key.py +0 -0
  275. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_no_host_paths.py +0 -0
  276. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_release_evidence.py +0 -0
  277. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_roadmap.py +0 -0
  278. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_symlink_ingestion.py +0 -0
  279. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_sync.py +0 -0
  280. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_command_polling.py +0 -0
  281. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_litellm_runtime.py +0 -0
  282. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_status.py +0 -0
  283. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docker_prune_scoping.py +0 -0
  284. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docker_uploads.py +0 -0
  285. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docs_examples.py +0 -0
  286. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eng50_capabilities.py +0 -0
  287. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_env_setup.py +0 -0
  288. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_environment_manifest_controls.py +0 -0
  289. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_filters_applied.py +0 -0
  290. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_sharding.py +0 -0
  291. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_single_task_summary.py +0 -0
  292. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_source_provenance.py +0 -0
  293. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_worker_retry.py +0 -0
  294. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_zero_task_guard.py +0 -0
  295. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_evaluation_environment_manifest.py +0 -0
  296. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_exclude_tasks.py +0 -0
  297. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_experiments_status.py +0 -0
  298. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_harvey_lab_shim.py +0 -0
  299. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hf_scores.py +0 -0
  300. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hilbench_adapter.py +0 -0
  301. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hosted_env.py +0 -0
  302. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hosted_env_rollout_contract.py +0 -0
  303. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_inbound_adapter_manifest.py +0 -0
  304. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_inbound_adapters.py +0 -0
  305. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_integration_run_suite.py +0 -0
  306. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_internet_policy.py +0 -0
  307. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job.py +0 -0
  308. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job_sequential_shared.py +0 -0
  309. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job_sequential_shared_resume.py +0 -0
  310. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_judge_symlink_ingestion.py +0 -0
  311. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_skills.py +0 -0
  312. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_skills_traversal.py +0 -0
  313. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_store.py +0 -0
  314. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_store_persistence.py +0 -0
  315. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_config.py +0 -0
  316. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_hardening.py +0 -0
  317. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_logging.py +0 -0
  318. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_runtime.py +0 -0
  319. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_smoke.py +0 -0
  320. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge.py +0 -0
  321. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge_event_tags.py +0 -0
  322. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge_verifier.py +0 -0
  323. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_memory_scorer.py +0 -0
  324. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_metrics.py +0 -0
  325. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_mock_openai_responses_server.py +0 -0
  326. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_monitor_scaffold.py +0 -0
  327. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_native_acp_usage.py +0 -0
  328. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_no_cross_provider_fallback.py +0 -0
  329. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_notification_order_real.py +0 -0
  330. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_oracle.py +0 -0
  331. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_oracle_chokepoint.py +0 -0
  332. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_paths_safe.py +0 -0
  333. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_paths_symlink_helpers.py +0 -0
  334. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_pi_acp_launcher.py +0 -0
  335. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_process.py +0 -0
  336. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_provider_auth_detection.py +0 -0
  337. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_providers.py +0 -0
  338. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reexport.py +0 -0
  339. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_registry_invariants.py +0 -0
  340. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_release_version.py +0 -0
  341. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_resolve_env_helpers.py +0 -0
  342. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reward_node.py +0 -0
  343. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reward_unified_contract.py +0 -0
  344. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rewards.py +0 -0
  345. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rewards_jsonl.py +0 -0
  346. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_architecture.py +0 -0
  347. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_branch.py +0 -0
  348. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_config_path_coercion.py +0 -0
  349. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_environment.py +0 -0
  350. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_import_no_side_effects.py +0 -0
  351. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_on_ask_user_wiring.py +0 -0
  352. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_probe_sandbox_health.py +0 -0
  353. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_upload.py +0 -0
  354. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rubric_config.py +0 -0
  355. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime.py +0 -0
  356. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime_config_wired.py +0 -0
  357. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime_live_sandbox.py +0 -0
  358. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox.py +0 -0
  359. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_exec_secret_handling.py +0 -0
  360. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_hardening.py +0 -0
  361. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
  362. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_multi_service.py +0 -0
  363. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_protocol.py +0 -0
  364. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_setup.py +0 -0
  365. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_snapshot_contract.py +0 -0
  366. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_upload_symlink.py +0 -0
  367. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_verifier_workspace.py +0 -0
  368. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene.py +0 -0
  369. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_outbox_trial.py +0 -0
  370. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_parallel_group.py +0 -0
  371. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_result_aggregation.py +0 -0
  372. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scoring.py +0 -0
  373. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sdk_internals.py +0 -0
  374. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sdk_lockdown.py +0 -0
  375. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_cli.py +0 -0
  376. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_export_error_channel.py +0 -0
  377. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_export_failures.py +0 -0
  378. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_orchestration.py +0 -0
  379. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_session_request_permission_dispatch.py +0 -0
  380. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval.py +0 -0
  381. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_dryrun.py +0 -0
  382. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_integration.py +0 -0
  383. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_sweep.py +0 -0
  384. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_traversal.py +0 -0
  385. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_invocation_artifacts.py +0 -0
  386. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_policy.py +0 -0
  387. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skills.py +0 -0
  388. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skills_dir_agent_home_link.py +0 -0
  389. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_harbor_parity.py +0 -0
  390. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_harbor_run_suite.py +0 -0
  391. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_publish_scrub.py +0 -0
  392. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_smoke.py +0 -0
  393. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_subscription_auth.py +0 -0
  394. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_check_eval_consistency.py +0 -0
  395. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_config.py +0 -0
  396. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_digest.py +0 -0
  397. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_download.py +0 -0
  398. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_tasks.py +0 -0
  399. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_token_usage_normalization.py +0 -0
  400. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_import_cli.py +0 -0
  401. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_task_gen_traversal.py +0 -0
  402. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_to_task_evidence.py +0 -0
  403. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_huggingface.py +0 -0
  404. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_parsers.py +0 -0
  405. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_task_gen.py +0 -0
  406. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_train_mode_artifact_emission.py +0 -0
  407. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trajectory_integration.py +0 -0
  408. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trajectory_streaming.py +0 -0
  409. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_agent_timeout_verify.py +0 -0
  410. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_install_agent_timeout.py +0 -0
  411. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_litellm_runtime.py +0 -0
  412. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_litellm.py +0 -0
  413. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_required.py +0 -0
  414. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_tracking.py +0 -0
  415. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_user.py +0 -0
  416. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_multi_container.py +0 -0
  417. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_output.py +0 -0
  418. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_output_freshness.py +0 -0
  419. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verify.py +0 -0
  420. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_workflow_action_pinning.py +0 -0
  421. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_yaml_config.py +0 -0
  422. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/__init__.py +0 -0
  423. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_export.py +0 -0
  424. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_export_nan_handling.py +0 -0
  425. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_redaction.py +0 -0
  426. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_step_granularity.py +0 -0
  427. {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_tree.py +0 -0
@@ -4,6 +4,23 @@
4
4
 
5
5
  ### Added
6
6
 
7
+ - **Registry-pinned dataset runs** — `bench eval create -d name@version`
8
+ (e.g. `-d skillsbench@1.1`) resolves a dataset from a git-backed
9
+ `registry.json` (see skillsbench `docs/dataset-versioning.md`): tasks are
10
+ cloned at their pinned `git_commit_id` into `.cache/datasets` and every
11
+ task directory is verified against its sha256 content digest before
12
+ anything runs; the entry's `bench_version` range is checked against the
13
+ installed benchflow. `--registry` overrides the default (skillsbench)
14
+ registry. `result.json`/`config.json` are stamped with `dataset_name`,
15
+ `dataset_version`, and a per-task `task_digest` (`summary.json` carries
16
+ the name/version); `--tasks-dir` dev runs carry no dataset fields but
17
+ still stamp a live-computed `task_digest`, so every trajectory stays
18
+ attributable to exact task content. `bench tasks digest <dir>` prints
19
+ the digest for task authoring, and `check_results.py` audits the stamps.
20
+ See [`docs/running-benchmarks.md`](docs/running-benchmarks.md). (#689,
21
+ #690, #691; `packaging` promoted to a core dependency for the
22
+ `bench_version` check.)
23
+
7
24
  - **`benchflow continue <run-folder>`** — resume a previous, unfinished
8
25
  (timed-out) `openhands` run to completion. A standalone tool (it does not
9
26
  touch the normal run path) that reconstructs the run's exact workspace and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: benchflow
3
- Version: 0.5.3.dev978
3
+ Version: 0.5.3.dev983
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
@@ -22,6 +22,7 @@ Requires-Dist: agent-client-protocol>=0.10
22
22
  Requires-Dist: anyio>=4.0
23
23
  Requires-Dist: httpx>=0.27.0
24
24
  Requires-Dist: litellm[proxy]==1.88.0rc1
25
+ Requires-Dist: packaging>=24
25
26
  Requires-Dist: pydantic>=2.7
26
27
  Requires-Dist: pyyaml>=6.0
27
28
  Requires-Dist: rich>=13.0
@@ -30,7 +31,6 @@ Requires-Dist: typer>=0.9
30
31
  Provides-Extra: bedrock
31
32
  Requires-Dist: boto3>=1.40; extra == 'bedrock'
32
33
  Provides-Extra: dev
33
- Requires-Dist: packaging>=24; extra == 'dev'
34
34
  Requires-Dist: pre-commit>=3.7; extra == 'dev'
35
35
  Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
36
36
  Requires-Dist: pytest>=9.0.3; extra == 'dev'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "benchflow"
3
- version = "0.5.3.dev978"
3
+ version = "0.5.3.dev983"
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"
@@ -12,6 +12,8 @@ dependencies = [
12
12
  "pydantic>=2.7",
13
13
  "pyyaml>=6.0",
14
14
  "rich>=13.0",
15
+ # Dataset registry bench_version checks (PEP 440 specifier sets).
16
+ "packaging>=24",
15
17
  "litellm[proxy]==1.88.0rc1",
16
18
  "tomli-w>=1.0",
17
19
  "typer>=0.9",
@@ -38,7 +40,6 @@ classifiers = [
38
40
 
39
41
  [project.optional-dependencies]
40
42
  dev = [
41
- "packaging>=24",
42
43
  "pre-commit>=3.7",
43
44
  "pytest>=9.0.3",
44
45
  "pytest-asyncio>=0.24.0",
@@ -826,11 +826,20 @@ class Evaluation:
826
826
 
827
827
  dataset = None
828
828
  if cfg.dataset_name:
829
- dataset = {
830
- "name": cfg.dataset_name,
831
- "version": cfg.dataset_version,
832
- "task_digest": cfg.dataset_task_digests.get(task_dir.name),
833
- }
829
+ dataset = {"name": cfg.dataset_name, "version": cfg.dataset_version}
830
+ task_digest_value = (
831
+ cfg.dataset_task_digests.get(task_dir.name) if cfg.dataset_name else None
832
+ )
833
+ if task_digest_value is None:
834
+ # Dev runs (--tasks-dir / --source-repo) stamp a live-computed
835
+ # digest so every trajectory stays attributable to the exact
836
+ # task content it ran, not just a directory name.
837
+ from benchflow._utils.task_authoring import task_digest
838
+
839
+ try:
840
+ task_digest_value = task_digest(task_dir)
841
+ except (OSError, ValueError, UnicodeError) as e:
842
+ logger.debug("Could not compute task digest for %s: %s", task_dir, e)
834
843
  skills_dir = (
835
844
  str(self._learner_skills_dir)
836
845
  if self._learner_skills_dir is not None
@@ -870,6 +879,7 @@ class Evaluation:
870
879
  export_generated_skills_to=export_to,
871
880
  source_provenance=task_source_provenance(cfg.source_provenance, task_dir),
872
881
  dataset=dataset,
882
+ task_digest=task_digest_value,
873
883
  usage_tracking=cfg.usage_tracking,
874
884
  )
875
885
  if skill_mode == SKILL_MODE_SELF_GEN:
@@ -526,6 +526,7 @@ def _write_config(
526
526
  scenes: list[Scene] | None = None,
527
527
  source_provenance: dict[str, Any] | None = None,
528
528
  dataset: dict[str, Any] | None = None,
529
+ task_digest: str | None = None,
529
530
  ) -> None:
530
531
  """Write config.json to rollout_dir with secrets filtered out."""
531
532
  recorded_env = {
@@ -556,7 +557,8 @@ def _write_config(
556
557
  if dataset is not None:
557
558
  config_data["dataset_name"] = dataset.get("name")
558
559
  config_data["dataset_version"] = dataset.get("version")
559
- config_data["task_digest"] = dataset.get("task_digest")
560
+ if task_digest is not None:
561
+ config_data["task_digest"] = task_digest
560
562
  (rollout_dir / "config.json").write_text(json.dumps(config_data, indent=2))
561
563
 
562
564
 
@@ -622,6 +624,7 @@ def _build_rollout_result(
622
624
  evolved_skills: dict[str, str] | None = None,
623
625
  source_provenance: dict[str, Any] | None = None,
624
626
  dataset: dict[str, Any] | None = None,
627
+ task_digest: str | None = None,
625
628
  diagnostics: RolloutDiagnostics | None = None,
626
629
  skill_policy: TaskSkillPolicy | None = None,
627
630
  sandbox_id: str | None = None,
@@ -753,11 +756,11 @@ def _build_rollout_result(
753
756
  {
754
757
  "dataset_name": dataset.get("name"),
755
758
  "dataset_version": dataset.get("version"),
756
- "task_digest": dataset.get("task_digest"),
757
759
  }
758
760
  if dataset is not None
759
761
  else {}
760
762
  ),
763
+ **({"task_digest": task_digest} if task_digest is not None else {}),
761
764
  "sandbox_id": sandbox_id,
762
765
  },
763
766
  indent=2,
@@ -1107,10 +1110,14 @@ class RolloutConfig:
1107
1110
  skip_verify: bool = False
1108
1111
  export_generated_skills_to: str | Path | None = None
1109
1112
  source_provenance: dict[str, Any] | None = None
1110
- # Registry dataset identity for this task: {"name", "version",
1111
- # "task_digest"} — stamped into config.json/result.json so published
1113
+ # Registry dataset identity: {"name", "version"} — stamped into
1114
+ # config.json/result.json as dataset_name/dataset_version so published
1112
1115
  # runs declare the dataset version they ran (dataset-versioning plan).
1113
1116
  dataset: dict[str, Any] | None = None
1117
+ # Content digest of the task directory ("sha256:<hex>", the skillsbench
1118
+ # registry algorithm). Registry-pinned for dataset runs, computed live
1119
+ # for dev runs — every result stays attributable to exact task content.
1120
+ task_digest: str | None = None
1114
1121
  planes: RolloutPlanes | None = field(default=None, repr=False, compare=False)
1115
1122
 
1116
1123
  def __post_init__(self) -> None:
@@ -1560,6 +1567,7 @@ class Rollout:
1560
1567
  scenes=cfg.effective_scenes,
1561
1568
  source_provenance=cfg.source_provenance,
1562
1569
  dataset=cfg.dataset,
1570
+ task_digest=cfg.task_digest,
1563
1571
  )
1564
1572
 
1565
1573
  self._phase = "setup"
@@ -2927,6 +2935,7 @@ class Rollout:
2927
2935
  evolved_skills=self._evolved_skills,
2928
2936
  source_provenance=self._config.source_provenance,
2929
2937
  dataset=self._config.dataset,
2938
+ task_digest=self._config.task_digest,
2930
2939
  diagnostics=self._diagnostics,
2931
2940
  usage_tracking=self._usage_tracking_metadata(),
2932
2941
  skill_policy=getattr(self, "_task_skill_policy", None)
@@ -32,7 +32,11 @@ from benchflow._utils.scoring import (
32
32
  classify_verifier_error,
33
33
  count_result_outcomes,
34
34
  )
35
- from benchflow._utils.source_provenance import source_issues, source_matches_parent
35
+ from benchflow._utils.source_provenance import (
36
+ is_sha256_digest,
37
+ source_issues,
38
+ source_matches_parent,
39
+ )
36
40
  from benchflow.trajectories.metrics import (
37
41
  count_skill_invocations,
38
42
  result_skill_invocations,
@@ -304,6 +308,73 @@ def _source_hash_truth_issues(source: object, label: str) -> list[str]:
304
308
  return _source_git_truth_issues(source_dict, local_path, label)
305
309
 
306
310
 
311
+ # Dataset identity stamp (dataset-versioning plan: benchflow #690 + dev-run
312
+ # digest stamping follow-up). dataset_name/dataset_version mark registry
313
+ # dataset runs; task_digest pins the exact task content for every run.
314
+ _DATASET_STAMP_KEYS = ("dataset_name", "dataset_version", "task_digest")
315
+
316
+
317
+ def _dataset_stamp_issues(artifact: object, label: str) -> list[str]:
318
+ """Audit the dataset identity stamp on one result.json/config.json.
319
+
320
+ Rules: dataset_name and dataset_version travel together; a dataset run
321
+ must carry a task_digest; any task_digest must be ``sha256:<64 hex>``.
322
+ A bare task_digest without dataset fields is a dev run — allowed.
323
+ """
324
+ if not isinstance(artifact, dict):
325
+ return []
326
+ artifact_dict = cast(dict[str, Any], artifact)
327
+ name = artifact_dict.get("dataset_name")
328
+ version = artifact_dict.get("dataset_version")
329
+ digest = artifact_dict.get("task_digest")
330
+ if name is None and version is None and digest is None:
331
+ return []
332
+ issues: list[str] = []
333
+ if (name is None) != (version is None):
334
+ issues.append(f"{label}: dataset_name and dataset_version must travel together")
335
+ for field_name, value in (("dataset_name", name), ("dataset_version", version)):
336
+ if value is not None and (not isinstance(value, str) or not value):
337
+ issues.append(f"{label}: {field_name} must be a non-empty string")
338
+ if name is not None and digest is None:
339
+ issues.append(f"{label}: dataset-stamped artifact missing task_digest")
340
+ if digest is not None and not is_sha256_digest(digest):
341
+ issues.append(f"{label}: task_digest must be 'sha256:<64 hex>'")
342
+ return issues
343
+
344
+
345
+ def _task_digest_truth_issues(result: object, label: str) -> list[str]:
346
+ """Recompute the task content digest when the task dir is still on disk.
347
+
348
+ Complements ``_source_hash_truth_issues``: ``source.file_hashes`` audits
349
+ per-file hashes, this audits the single registry-algorithm digest the
350
+ leaderboard pipeline keys on.
351
+ """
352
+ if not isinstance(result, dict):
353
+ return []
354
+ result_dict = cast(dict[str, Any], result)
355
+ digest = result_dict.get("task_digest")
356
+ if not is_sha256_digest(digest):
357
+ return [] # absent or malformed — format issues reported elsewhere
358
+ source = result_dict.get("source")
359
+ if not isinstance(source, dict):
360
+ return []
361
+ local_path_raw = source.get("local_path")
362
+ if not isinstance(local_path_raw, str):
363
+ return []
364
+ local_path = Path(local_path_raw)
365
+ if not (local_path / "task.toml").exists():
366
+ return []
367
+ try:
368
+ from benchflow._utils.task_authoring import task_digest
369
+
370
+ actual = task_digest(local_path)
371
+ except Exception as e:
372
+ return [f"{label}: task_digest could not be recomputed: {e}"]
373
+ if actual != digest:
374
+ return [f"{label}: task_digest does not match local_path content"]
375
+ return []
376
+
377
+
307
378
  def _git_stdout(cwd: Path, *args: str) -> str | None:
308
379
  completed = subprocess.run(
309
380
  ["git", "-C", str(cwd), *args],
@@ -535,6 +606,18 @@ def check_agent(agent_dir: Path) -> dict:
535
606
  if source_truth_issues:
536
607
  findings["issues"].extend(source_truth_issues)
537
608
  findings["ok"] = False
609
+ dataset_stamp_issues = _dataset_stamp_issues(
610
+ r, f"{r.get('task_name', '?')}: result.json"
611
+ )
612
+ if dataset_stamp_issues:
613
+ findings["issues"].extend(dataset_stamp_issues)
614
+ findings["ok"] = False
615
+ digest_truth_issues = _task_digest_truth_issues(
616
+ r, f"{r.get('task_name', '?')}: result.json"
617
+ )
618
+ if digest_truth_issues:
619
+ findings["issues"].extend(digest_truth_issues)
620
+ findings["ok"] = False
538
621
  _config_path, config, config_error = _load_config(result_file)
539
622
  if config_error:
540
623
  findings["issues"].append(f"{r.get('task_name', '?')}: {config_error}")
@@ -639,6 +722,18 @@ def check_agent(agent_dir: Path) -> dict:
639
722
  f"{r.get('task_name', '?')}: config.json source does not match result.json"
640
723
  )
641
724
  findings["ok"] = False
725
+ config_dataset_issues = _dataset_stamp_issues(
726
+ config, f"{r.get('task_name', '?')}: config.json"
727
+ )
728
+ if config_dataset_issues:
729
+ findings["issues"].extend(config_dataset_issues)
730
+ findings["ok"] = False
731
+ if any(config.get(k) != r.get(k) for k in _DATASET_STAMP_KEYS):
732
+ findings["issues"].append(
733
+ f"{r.get('task_name', '?')}: config.json dataset stamp "
734
+ f"does not match result.json"
735
+ )
736
+ findings["ok"] = False
642
737
 
643
738
  # Infrastructure errors — driven from the central diagnostic registry
644
739
  # so adding a new diagnostic kind doesn't require editing this file
@@ -768,6 +863,17 @@ def check_agent(agent_dir: Path) -> dict:
768
863
  "summary.json missing source provenance and not all results have source"
769
864
  )
770
865
  findings["ok"] = False
866
+ # Dataset identity must agree across summary.json and every
867
+ # result.json — one leaderboard namespace per dataset version.
868
+ for dataset_key in ("dataset_name", "dataset_version"):
869
+ dataset_values = {r.get(dataset_key) for r in results}
870
+ dataset_values.add(summary.get(dataset_key))
871
+ if len(dataset_values) > 1:
872
+ findings["issues"].append(
873
+ f"summary.json {dataset_key} does not agree across "
874
+ f"summary and results: {sorted(map(repr, dataset_values))}"
875
+ )
876
+ findings["ok"] = False
771
877
  expected_model = _expected(agent, "model")
772
878
  expected_environment = _expected(agent, "environment")
773
879
  expected_concurrency = _expected(agent, "concurrency")
@@ -324,19 +324,20 @@ class TestEvalCreateDatasetCli:
324
324
 
325
325
 
326
326
  class TestDatasetStamping:
327
- DATASET: ClassVar[dict] = {
328
- "name": "skillsbench",
329
- "version": "1.1",
330
- "task_digest": "sha256:" + "f" * 64,
331
- }
327
+ DATASET: ClassVar[dict] = {"name": "skillsbench", "version": "1.1"}
328
+ TASK_DIGEST = "sha256:" + "f" * 64
332
329
 
333
330
  def test_rollout_config_threads_dataset_through_from_legacy(self, tmp_path):
334
331
  from benchflow.rollout import RolloutConfig
335
332
 
336
333
  cfg = RolloutConfig.from_legacy(
337
- task_path=tmp_path, agent="oracle", dataset=self.DATASET
334
+ task_path=tmp_path,
335
+ agent="oracle",
336
+ dataset=self.DATASET,
337
+ task_digest=self.TASK_DIGEST,
338
338
  )
339
339
  assert cfg.dataset == self.DATASET
340
+ assert cfg.task_digest == self.TASK_DIGEST
340
341
 
341
342
  def test_config_json_stamped(self, tmp_path):
342
343
  from benchflow.rollout import _write_config
@@ -361,11 +362,12 @@ class TestDatasetStamping:
361
362
  started_at=datetime(2026, 6, 12),
362
363
  agent_env={},
363
364
  dataset=self.DATASET,
365
+ task_digest=self.TASK_DIGEST,
364
366
  )
365
367
  config = json.loads((tmp_path / "config.json").read_text())
366
368
  assert config["dataset_name"] == "skillsbench"
367
369
  assert config["dataset_version"] == "1.1"
368
- assert config["task_digest"] == self.DATASET["task_digest"]
370
+ assert config["task_digest"] == self.TASK_DIGEST
369
371
 
370
372
  def test_config_json_unstamped_without_dataset(self, tmp_path):
371
373
  from benchflow.rollout import _write_config
@@ -392,6 +394,7 @@ class TestDatasetStamping:
392
394
  )
393
395
  config = json.loads((tmp_path / "config.json").read_text())
394
396
  assert "dataset_name" not in config
397
+ assert "task_digest" not in config
395
398
 
396
399
  def test_result_json_stamped(self, tmp_path):
397
400
  from benchflow.rollout import _build_rollout_result
@@ -413,13 +416,57 @@ class TestDatasetStamping:
413
416
  started_at=datetime(2026, 6, 12),
414
417
  timing={},
415
418
  dataset=self.DATASET,
419
+ task_digest=self.TASK_DIGEST,
416
420
  )
417
421
  result = json.loads((tmp_path / "result.json").read_text())
418
422
  assert result["dataset_name"] == "skillsbench"
419
423
  assert result["dataset_version"] == "1.1"
420
- assert result["task_digest"] == self.DATASET["task_digest"]
424
+ assert result["task_digest"] == self.TASK_DIGEST
425
+
426
+ def test_result_json_dev_run_stamps_digest_without_dataset(self, tmp_path):
427
+ """Dev runs carry task_digest but no dataset identity fields."""
428
+ from benchflow.rollout import _build_rollout_result
429
+
430
+ _build_rollout_result(
431
+ tmp_path,
432
+ task_name="task-a",
433
+ rollout_name="task-a__r1",
434
+ agent="oracle",
435
+ agent_name="oracle",
436
+ model=None,
437
+ n_tool_calls=0,
438
+ prompts=[],
439
+ error=None,
440
+ verifier_error=None,
441
+ trajectory=[],
442
+ partial_trajectory=False,
443
+ rewards={"reward": 1.0},
444
+ started_at=datetime(2026, 6, 12),
445
+ timing={},
446
+ task_digest=self.TASK_DIGEST,
447
+ )
448
+ result = json.loads((tmp_path / "result.json").read_text())
449
+ assert result["task_digest"] == self.TASK_DIGEST
450
+ assert "dataset_name" not in result
451
+ assert "dataset_version" not in result
452
+
453
+ @staticmethod
454
+ def _capture_rollout_create(monkeypatch):
455
+ captured = {}
421
456
 
422
- async def test_run_single_task_builds_per_task_dataset(self, tmp_path, monkeypatch):
457
+ async def _fake_run():
458
+ return SimpleNamespace(rewards={"reward": 1.0})
459
+
460
+ async def fake_create(rollout_config):
461
+ captured["config"] = rollout_config
462
+ return SimpleNamespace(run=_fake_run)
463
+
464
+ monkeypatch.setattr("benchflow.rollout.Rollout.create", fake_create)
465
+ return captured
466
+
467
+ async def test_run_single_task_uses_registry_digest_for_dataset_runs(
468
+ self, tmp_path, monkeypatch
469
+ ):
423
470
  from benchflow.evaluation import Evaluation, EvaluationConfig
424
471
 
425
472
  task_dir = _make_task(tmp_path / "tasks", "task-a")
@@ -430,24 +477,26 @@ class TestDatasetStamping:
430
477
  dataset_version="1.1",
431
478
  dataset_task_digests={"task-a": digest},
432
479
  )
433
- captured = {}
434
-
435
- class FakeRollout:
436
- @staticmethod
437
- async def create(rollout_config):
438
- captured["config"] = rollout_config
439
- return SimpleNamespace(run=_fake_run)
480
+ captured = self._capture_rollout_create(monkeypatch)
481
+ evaluation = Evaluation(
482
+ tasks_dir=tmp_path / "tasks", jobs_dir=tmp_path / "jobs", config=cfg
483
+ )
484
+ await evaluation._run_single_task(task_dir, cfg)
485
+ assert captured["config"].dataset == {"name": "skillsbench", "version": "1.1"}
486
+ assert captured["config"].task_digest == digest
440
487
 
441
- async def _fake_run():
442
- return SimpleNamespace(rewards={"reward": 1.0})
488
+ async def test_run_single_task_computes_digest_for_dev_runs(
489
+ self, tmp_path, monkeypatch
490
+ ):
491
+ """Dev runs (no --dataset) stamp a live-computed content digest."""
492
+ from benchflow.evaluation import Evaluation, EvaluationConfig
443
493
 
444
- monkeypatch.setattr("benchflow.rollout.Rollout.create", FakeRollout.create)
494
+ task_dir = _make_task(tmp_path / "tasks", "task-a")
495
+ cfg = EvaluationConfig(agent="oracle")
496
+ captured = self._capture_rollout_create(monkeypatch)
445
497
  evaluation = Evaluation(
446
498
  tasks_dir=tmp_path / "tasks", jobs_dir=tmp_path / "jobs", config=cfg
447
499
  )
448
500
  await evaluation._run_single_task(task_dir, cfg)
449
- assert captured["config"].dataset == {
450
- "name": "skillsbench",
451
- "version": "1.1",
452
- "task_digest": digest,
453
- }
501
+ assert captured["config"].dataset is None
502
+ assert captured["config"].task_digest == task_digest(task_dir)