benchflow 0.7.4__tar.gz → 0.7.6.dev2055__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 (727) hide show
  1. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/CHANGELOG.md +21 -0
  2. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/PKG-INFO +1 -1
  3. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/pyproject.toml +1 -1
  4. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/__init__.py +6 -0
  5. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/task_authoring/__init__.py +4 -4
  6. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/review.py +52 -7
  7. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/traj_capture.py +3 -0
  8. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/review/__init__.py +27 -5
  9. benchflow-0.7.6.dev2055/src/benchflow/review/config.py +359 -0
  10. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/review/prompts.py +20 -1
  11. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/review/runner.py +112 -16
  12. benchflow-0.7.6.dev2055/src/benchflow/review/scoring.py +119 -0
  13. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/review/wrapper.py +45 -10
  14. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/docker.py +36 -1
  15. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_review_boundaries.py +49 -0
  16. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_review_rubric.py +416 -4
  17. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_review_runtime.py +274 -11
  18. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox.py +48 -0
  19. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_workspace.py +23 -0
  20. benchflow-0.7.4/src/benchflow/review/config.py +0 -250
  21. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/.gitignore +0 -0
  22. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/LICENSE +0 -0
  23. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/README.md +0 -0
  24. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_dotenv.py +0 -0
  25. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_paths.py +0 -0
  26. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_run.py +0 -0
  27. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_types.py +0 -0
  28. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/__init__.py +0 -0
  29. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/benchmark_repos.py +0 -0
  30. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/build_context_stage.py +0 -0
  31. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/config.py +0 -0
  32. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/config_override.py +0 -0
  33. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/content_address.py +0 -0
  34. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/dataset_registry.py +0 -0
  35. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/env_registry.py +0 -0
  36. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/evaluation_results.py +0 -0
  37. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/hf_datasets.py +0 -0
  38. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/json_safe.py +0 -0
  39. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/learner_memory.py +0 -0
  40. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/live_activity.py +0 -0
  41. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/result_metadata.py +0 -0
  42. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/reward_events.py +0 -0
  43. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/scoring.py +0 -0
  44. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/source_provenance.py +0 -0
  45. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
  46. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
  47. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
  48. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
  49. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/text.py +0 -0
  50. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/_utils/yaml_loader.py +0 -0
  51. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/__init__.py +0 -0
  52. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/client.py +0 -0
  53. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/container_transport.py +0 -0
  54. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/runtime.py +0 -0
  55. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/selection.py +0 -0
  56. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/session.py +0 -0
  57. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/transport.py +0 -0
  58. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/acp/types.py +0 -0
  59. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/__init__.py +0 -0
  60. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/_toolathlon.py +0 -0
  61. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/_toolathlon_container.py +0 -0
  62. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
  63. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
  64. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/_toolathlon_services.py +0 -0
  65. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/harbor.py +0 -0
  66. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/inbound.py +0 -0
  67. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/inspect_ai.py +0 -0
  68. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/ors.py +0 -0
  69. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/resources/__init__.py +0 -0
  70. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
  71. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
  72. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/adapters/source.py +0 -0
  73. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agent_router.py +0 -0
  74. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agent_router_guide.py +0 -0
  75. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agent_router_parity.py +0 -0
  76. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agent_router_scaffold.py +0 -0
  77. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/__init__.py +0 -0
  78. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/codex_config.py +0 -0
  79. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/credentials.py +0 -0
  80. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
  81. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/env.py +0 -0
  82. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/errors.py +0 -0
  83. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
  84. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/install.py +0 -0
  85. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/manifest.py +0 -0
  86. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
  87. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/pi_acp_launcher.py +0 -0
  88. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/protocol.py +0 -0
  89. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/providers.py +0 -0
  90. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/registry.py +0 -0
  91. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/agents/remote_manifests.py +0 -0
  92. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/branch.py +0 -0
  93. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/__init__.py +0 -0
  94. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_failure_evidence.py +0 -0
  95. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_hosted_env.py +0 -0
  96. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_live_progress.py +0 -0
  97. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_options.py +0 -0
  98. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_shared.py +0 -0
  99. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_traj_tui.py +0 -0
  100. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/_traj_upload_ui.py +0 -0
  101. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/adopt.py +0 -0
  102. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/agent.py +0 -0
  103. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/continue_cmd.py +0 -0
  104. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/environment.py +0 -0
  105. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/eval_artifacts.py +0 -0
  106. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/eval_lift.py +0 -0
  107. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/hub.py +0 -0
  108. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/main.py +0 -0
  109. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/monitor.py +0 -0
  110. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/sandbox.py +0 -0
  111. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/skills.py +0 -0
  112. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/tasks.py +0 -0
  113. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/trace_import.py +0 -0
  114. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/train.py +0 -0
  115. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/cli/traj.py +0 -0
  116. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/__init__.py +0 -0
  117. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/batch.py +0 -0
  118. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/orchestrator.py +0 -0
  119. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/replay_proxy.py +0 -0
  120. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/run_folder.py +0 -0
  121. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
  122. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/contracts/__init__.py +0 -0
  123. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/contracts/planes.py +0 -0
  124. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/contracts/user.py +0 -0
  125. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/demo_task/environment/Dockerfile +0 -0
  126. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/demo_task/instruction.md +0 -0
  127. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/demo_task/task.md +0 -0
  128. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/demo_task/task.toml +0 -0
  129. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/demo_task/tests/test.sh +0 -0
  130. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/diagnostics.py +0 -0
  131. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/__init__.py +0 -0
  132. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
  133. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
  134. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/manifest.py +0 -0
  135. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/manifest_env.py +0 -0
  136. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/protocol.py +0 -0
  137. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/environment/readiness.py +0 -0
  138. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/eval_artifacts.py +0 -0
  139. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/eval_lift.py +0 -0
  140. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/eval_plan.py +0 -0
  141. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/eval_sharding.py +0 -0
  142. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/eval_worker.py +0 -0
  143. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/evaluation.py +0 -0
  144. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/experimental/__init__.py +0 -0
  145. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/experimental/mcp/__init__.py +0 -0
  146. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/experimental/mcp/hooks.py +0 -0
  147. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
  148. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/hosted_env.py +0 -0
  149. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/hub/__init__.py +0 -0
  150. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/hub/harbor_registry.py +0 -0
  151. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/integrations/__init__.py +0 -0
  152. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/integrations/trl/__init__.py +0 -0
  153. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/integrations/trl/spec.py +0 -0
  154. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/learner_skills.py +0 -0
  155. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/learner_store.py +0 -0
  156. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/loop_strategies.py +0 -0
  157. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/loop_sweep.py +0 -0
  158. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/metrics.py +0 -0
  159. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/models.py +0 -0
  160. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/monitor.py +0 -0
  161. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/__init__.py +0 -0
  162. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
  163. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
  164. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/litellm_config.py +0 -0
  165. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/litellm_logging.py +0 -0
  166. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/litellm_runtime.py +0 -0
  167. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/providers/runtime.py +0 -0
  168. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/__init__.py +0 -0
  169. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/_progress.py +0 -0
  170. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/azure_blob.py +0 -0
  171. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/broker.py +0 -0
  172. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/huggingface.py +0 -0
  173. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/redact.py +0 -0
  174. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/publish/traj_report.py +0 -0
  175. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/py.typed +0 -0
  176. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/review/default-rubric.json +0 -0
  177. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/README.md +0 -0
  178. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/__init__.py +0 -0
  179. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/builtins.py +0 -0
  180. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/events.py +0 -0
  181. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/file_readers.py +0 -0
  182. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/llm.py +0 -0
  183. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/memory_scorer.py +0 -0
  184. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/node.py +0 -0
  185. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/protocol.py +0 -0
  186. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/rubric.py +0 -0
  187. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/rubric_config.py +0 -0
  188. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rewards/validation.py +0 -0
  189. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/__init__.py +0 -0
  190. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_config.py +0 -0
  191. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_deadline.py +0 -0
  192. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_results.py +0 -0
  193. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_setup.py +0 -0
  194. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_skills.py +0 -0
  195. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_usage.py +0 -0
  196. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/_user_loop.py +0 -0
  197. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/session_factory_runtime.py +0 -0
  198. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout/task_runtime.py +0 -0
  199. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout_branch.py +0 -0
  200. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/rollout_planes.py +0 -0
  201. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/runtime.py +0 -0
  202. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/__init__.py +0 -0
  203. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_base.py +0 -0
  204. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
  205. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_compose.py +0 -0
  206. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
  207. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
  208. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
  209. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
  210. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/_sdk_ops.py +0 -0
  211. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore.py +0 -0
  212. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore_builder.py +0 -0
  213. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore_image.py +0 -0
  214. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
  215. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
  216. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
  217. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/apple_container.py +0 -0
  218. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/daytona.py +0 -0
  219. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/daytona_dind.py +0 -0
  220. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/daytona_pty.py +0 -0
  221. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/daytona_reaper.py +0 -0
  222. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/daytona_strategies.py +0 -0
  223. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/lockdown.py +0 -0
  224. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/metadata.py +0 -0
  225. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/modal_impl.py +0 -0
  226. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/__init__.py +0 -0
  227. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/_base.py +0 -0
  228. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/agentcore.py +0 -0
  229. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/apple.py +0 -0
  230. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/daytona.py +0 -0
  231. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/process/docker.py +0 -0
  232. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/protocol.py +0 -0
  233. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/providers.py +0 -0
  234. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/services.py +0 -0
  235. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/setup.py +0 -0
  236. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/snapshot.py +0 -0
  237. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sandbox/user.py +0 -0
  238. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/scenes.py +0 -0
  239. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/sdk.py +0 -0
  240. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/self_gen.py +0 -0
  241. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skill_eval/__init__.py +0 -0
  242. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skill_eval/_core.py +0 -0
  243. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skill_eval/gepa_export.py +0 -0
  244. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skill_eval/schema.py +0 -0
  245. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skill_policy.py +0 -0
  246. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/skills.py +0 -0
  247. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/__init__.py +0 -0
  248. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/_document_evidence.py +0 -0
  249. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/_document_normalize.py +0 -0
  250. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/_document_parse.py +0 -0
  251. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/_document_profiles.py +0 -0
  252. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/acceptance_live.py +0 -0
  253. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/acceptance_live_model.py +0 -0
  254. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/acceptance_live_report.py +0 -0
  255. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/acceptance_live_validation.py +0 -0
  256. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/config.py +0 -0
  257. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/discovery.py +0 -0
  258. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/document.py +0 -0
  259. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/env.py +0 -0
  260. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/export.py +0 -0
  261. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/imports.py +0 -0
  262. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/output_format.py +0 -0
  263. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/package.py +0 -0
  264. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/paths.py +0 -0
  265. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/prompts.py +0 -0
  266. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/runtime_capabilities.py +0 -0
  267. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/runtime_view.py +0 -0
  268. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/task.py +0 -0
  269. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier.py +0 -0
  270. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_core.py +0 -0
  271. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_document.py +0 -0
  272. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_errors.py +0 -0
  273. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_judge_inputs.py +0 -0
  274. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_ors_episode.py +0 -0
  275. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_reward_kit.py +0 -0
  276. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_scan.py +0 -0
  277. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/task/verifier_script_strategy.py +0 -0
  278. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/templates/__init__.py +0 -0
  279. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/templates/judge.py.tmpl +0 -0
  280. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/templates/test.sh.tmpl +0 -0
  281. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/__init__.py +0 -0
  282. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/huggingface.py +0 -0
  283. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/local.py +0 -0
  284. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/models.py +0 -0
  285. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/parsers.py +0 -0
  286. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/traces/task_gen.py +0 -0
  287. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/training/__init__.py +0 -0
  288. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/training/backends/__init__.py +0 -0
  289. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/training/backends/prime_rl.py +0 -0
  290. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/training/run_manifest.py +0 -0
  291. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/__init__.py +0 -0
  292. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/_capture.py +0 -0
  293. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/_export_common.py +0 -0
  294. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/_llm_capture.py +0 -0
  295. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/call_purpose.py +0 -0
  296. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/export.py +0 -0
  297. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/export_adp.py +0 -0
  298. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/export_atif.py +0 -0
  299. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/export_prime_sft.py +0 -0
  300. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/export_trl_sft.py +0 -0
  301. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/metrics.py +0 -0
  302. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/results.py +0 -0
  303. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/sessions.py +0 -0
  304. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/tree.py +0 -0
  305. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
  306. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/types.py +0 -0
  307. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/trajectories/viewer.py +0 -0
  308. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/src/benchflow/usage_tracking.py +0 -0
  309. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/__init__.py +0 -0
  310. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/acceptance_live_harness.py +0 -0
  311. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/__init__.py +0 -0
  312. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_manifest_dirscan.py +0 -0
  313. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_manifest_loader.py +0 -0
  314. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_manifest_parity.py +0 -0
  315. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_manifest_wiring.py +0 -0
  316. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_namespace_shorthand.py +0 -0
  317. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_plugin_entry_points.py +0 -0
  318. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_protocol.py +0 -0
  319. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/agents/test_remote_manifest_autoload.py +0 -0
  320. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/README.md +0 -0
  321. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
  322. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
  323. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
  324. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/instruction.md +0 -0
  325. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
  326. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/task.md +0 -0
  327. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/task.toml +0 -0
  328. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/acp_smoke/tests/test.sh +0 -0
  329. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/conformance-results.json +0 -0
  330. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/proof_multi_agent.py +0 -0
  331. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/proof_snapshot.py +0 -0
  332. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/run_conformance.py +0 -0
  333. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
  334. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/conftest.py +0 -0
  335. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/__init__.py +0 -0
  336. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/_helpers.py +0 -0
  337. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/test_batch.py +0 -0
  338. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/test_orchestrator.py +0 -0
  339. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/test_replay_proxy.py +0 -0
  340. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/continue_run/test_run_folder.py +0 -0
  341. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/__init__.py +0 -0
  342. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_chibench_manifest.py +0 -0
  343. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_clawsbench_manifest.py +0 -0
  344. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_manifest.py +0 -0
  345. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_manifest_env.py +0 -0
  346. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_protocol.py +0 -0
  347. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/environment/test_readiness.py +0 -0
  348. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
  349. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/instruction.md +0 -0
  350. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/solution/solve.sh +0 -0
  351. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/task.md +0 -0
  352. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/task.toml +0 -0
  353. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/hello-world-task/tests/test.sh +0 -0
  354. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/test_claude.sh +0 -0
  355. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/test_codex.sh +0 -0
  356. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/test_codex_custom_provider.sh +0 -0
  357. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/test_gemini.sh +0 -0
  358. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/test_openclaw.sh +0 -0
  359. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/traces/minimal-claude.jsonl +0 -0
  360. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
  361. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/README.md +0 -0
  362. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
  363. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
  364. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/alpha-task/task.toml +0 -0
  365. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
  366. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
  367. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
  368. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/beta-task/instruction.md +0 -0
  369. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/beta-task/task.toml +0 -0
  370. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
  371. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/mock_acp_agent.py +0 -0
  372. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
  373. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
  374. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/mock_openai_responses_server.py +0 -0
  375. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
  376. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
  377. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
  378. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
  379. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
  380. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
  381. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
  382. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
  383. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
  384. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
  385. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
  386. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
  387. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
  388. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
  389. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
  390. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
  391. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
  392. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
  393. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
  394. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
  395. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
  396. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
  397. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
  398. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
  399. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
  400. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
  401. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
  402. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
  403. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
  404. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
  405. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
  406. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
  407. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
  408. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
  409. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
  410. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
  411. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
  412. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
  413. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
  414. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
  415. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
  416. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
  417. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
  418. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
  419. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
  420. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
  421. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
  422. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
  423. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
  424. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
  425. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
  426. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
  427. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
  428. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
  429. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
  430. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
  431. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
  432. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
  433. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
  434. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
  435. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/_consistency.py +0 -0
  436. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/agent_judge.py +0 -0
  437. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/check_adapter_evidence.py +0 -0
  438. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/check_hosted_env_evidence.py +0 -0
  439. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/check_results.py +0 -0
  440. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
  441. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/check_trace_to_task_evidence.py +0 -0
  442. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/claude-agent-acp.yaml +0 -0
  443. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/codex-acp.yaml +0 -0
  444. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/gemini.yaml +0 -0
  445. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
  446. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/mimo.yaml +0 -0
  447. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/openclaw.yaml +0 -0
  448. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/opencode.yaml +0 -0
  449. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/openhands.yaml +0 -0
  450. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/configs/pi-acp.yaml +0 -0
  451. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/deepagents_harness.py +0 -0
  452. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/rubric_checks.py +0 -0
  453. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/run.sh +0 -0
  454. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/run_suite.py +0 -0
  455. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/scenarios.py +0 -0
  456. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/integration/suites/release.yaml +0 -0
  457. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acceptance_evidence.py +0 -0
  458. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acceptance_live.py +0 -0
  459. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acceptance_live_execution.py +0 -0
  460. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp.py +0 -0
  461. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp_capability_advertising.py +0 -0
  462. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp_mcp_servers.py +0 -0
  463. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp_model_config_dispatch.py +0 -0
  464. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp_pinned_protocol_guard.py +0 -0
  465. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_acp_setup_failure_propagation.py +0 -0
  466. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_adapter_scripts.py +0 -0
  467. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_adapters.py +0 -0
  468. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_cli.py +0 -0
  469. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_env_resolution.py +0 -0
  470. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_gemini_defaults.py +0 -0
  471. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_idle_timeout_cli.py +0 -0
  472. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_model_decouple.py +0 -0
  473. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_registry.py +0 -0
  474. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_router.py +0 -0
  475. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_router_cli_e2e.py +0 -0
  476. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_router_scaffold.py +0 -0
  477. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_setup.py +0 -0
  478. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agent_spec.py +0 -0
  479. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agentcore_builder.py +0 -0
  480. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agentcore_parallel.py +0 -0
  481. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agentcore_reaper.py +0 -0
  482. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agentcore_sandbox.py +0 -0
  483. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_agentcore_transport.py +0 -0
  484. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_api_error_capture.py +0 -0
  485. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_apple_container_sandbox.py +0 -0
  486. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_bare_model_provider.py +0 -0
  487. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_base_install_imports.py +0 -0
  488. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_bedrock_thinking.py +0 -0
  489. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_benchflow_experiment_review_validator.py +0 -0
  490. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
  491. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_branch.py +0 -0
  492. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_build_context_stage.py +0 -0
  493. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_build_review_pack.py +0 -0
  494. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_capture_trajectory.py +0 -0
  495. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_check_skillsbench_harbor_parity.py +0 -0
  496. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_clawsbench_slice.py +0 -0
  497. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_adopt_aliases.py +0 -0
  498. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_arg_validation.py +0 -0
  499. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_daytona.py +0 -0
  500. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_docs_drift.py +0 -0
  501. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_edge_case_hardening.py +0 -0
  502. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_hub_env.py +0 -0
  503. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_live_progress.py +0 -0
  504. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_cli_misc.py +0 -0
  505. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_codex_review.py +0 -0
  506. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_codex_self_write_auth.py +0 -0
  507. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_config_override.py +0 -0
  508. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_config_redaction.py +0 -0
  509. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_connect_as_env.py +0 -0
  510. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_console_error_truncation.py +0 -0
  511. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_console_progress.py +0 -0
  512. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_continuallearningbench_adapter.py +0 -0
  513. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_dataset_registry.py +0 -0
  514. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_command_polling.py +0 -0
  515. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_dind_compose_up.py +0 -0
  516. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_download.py +0 -0
  517. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_litellm_runtime.py +0 -0
  518. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_poll_deadline.py +0 -0
  519. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_daytona_reap.py +0 -0
  520. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_deepagents_agent.py +0 -0
  521. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_diagnostics.py +0 -0
  522. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_docker_prune_scoping.py +0 -0
  523. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_docker_uploads.py +0 -0
  524. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_docs_examples.py +0 -0
  525. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eng50_capabilities.py +0 -0
  526. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_env_registry.py +0 -0
  527. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_env_setup.py +0 -0
  528. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_environment_manifest_controls.py +0 -0
  529. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_artifact_cli.py +0 -0
  530. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_filters_applied.py +0 -0
  531. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_lift.py +0 -0
  532. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_sharding.py +0 -0
  533. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_single_task_summary.py +0 -0
  534. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_source_provenance.py +0 -0
  535. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_worker_retry.py +0 -0
  536. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_eval_zero_task_guard.py +0 -0
  537. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_evaluation_environment_manifest.py +0 -0
  538. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_exclude_tasks.py +0 -0
  539. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_filter_credentialed_cells.py +0 -0
  540. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_harvey_lab_shim.py +0 -0
  541. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_hilbench_adapter.py +0 -0
  542. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_hosted_env.py +0 -0
  543. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_hosted_env_rollout_contract.py +0 -0
  544. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_hub_harbor_registry.py +0 -0
  545. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_inbound_adapter_manifest.py +0 -0
  546. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_inbound_adapters.py +0 -0
  547. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_agent_judge.py +0 -0
  548. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_check_results.py +0 -0
  549. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_consistency.py +0 -0
  550. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_matrix.py +0 -0
  551. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_provider_selection.py +0 -0
  552. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_run_suite.py +0 -0
  553. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_integration_suite.py +0 -0
  554. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_internet_policy.py +0 -0
  555. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_job.py +0 -0
  556. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_job_sequential_shared.py +0 -0
  557. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_job_sequential_shared_resume.py +0 -0
  558. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_judge_robustness.py +0 -0
  559. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_judge_symlink_ingestion.py +0 -0
  560. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_learner_skills.py +0 -0
  561. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_learner_skills_traversal.py +0 -0
  562. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_learner_store.py +0 -0
  563. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_learner_store_persistence.py +0 -0
  564. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_config.py +0 -0
  565. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_hardening.py +0 -0
  566. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_logging.py +0 -0
  567. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_model_via_env_generic.py +0 -0
  568. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_reasoning_passthrough.py +0 -0
  569. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_runtime.py +0 -0
  570. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_litellm_smoke.py +0 -0
  571. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_live_llm_trajectory.py +0 -0
  572. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_llm_judge.py +0 -0
  573. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_llm_judge_event_tags.py +0 -0
  574. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_llm_judge_verifier.py +0 -0
  575. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_loop_strategies.py +0 -0
  576. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_loop_summary.py +0 -0
  577. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_loop_sweep.py +0 -0
  578. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_memory_scorer.py +0 -0
  579. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_metrics.py +0 -0
  580. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_mle_bench_adapter.py +0 -0
  581. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_mock_openai_responses_server.py +0 -0
  582. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_monitor_scaffold.py +0 -0
  583. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_native_acp_usage.py +0 -0
  584. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_no_cross_provider_fallback.py +0 -0
  585. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_notification_order_real.py +0 -0
  586. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_opencode_family_proxy_tracking.py +0 -0
  587. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_oracle.py +0 -0
  588. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_oracle_chokepoint.py +0 -0
  589. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_paths_safe.py +0 -0
  590. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_paths_symlink_helpers.py +0 -0
  591. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_pi_acp_launcher.py +0 -0
  592. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_pi_acp_proxy_routing.py +0 -0
  593. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_process.py +0 -0
  594. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_project_skills_layout.py +0 -0
  595. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_provider_auth_detection.py +0 -0
  596. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_providers.py +0 -0
  597. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_publish_azure_blob.py +0 -0
  598. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_reexport.py +0 -0
  599. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_registry_invariants.py +0 -0
  600. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_release_hardening_r5.py +0 -0
  601. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_release_version.py +0 -0
  602. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_release_workflow_wiring.py +0 -0
  603. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_resolve_env_helpers.py +0 -0
  604. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_reward_lenient.py +0 -0
  605. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_reward_node.py +0 -0
  606. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_reward_range.py +0 -0
  607. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_reward_unified_contract.py +0 -0
  608. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rewards.py +0 -0
  609. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rewards_jsonl.py +0 -0
  610. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_architecture.py +0 -0
  611. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_branch.py +0 -0
  612. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_config_path_coercion.py +0 -0
  613. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_environment.py +0 -0
  614. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_hard_deadline.py +0 -0
  615. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_import_no_side_effects.py +0 -0
  616. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_on_ask_user_wiring.py +0 -0
  617. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_planes_contract.py +0 -0
  618. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_probe_sandbox_health.py +0 -0
  619. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_session_factory_dispatch.py +0 -0
  620. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_setup_commands.py +0 -0
  621. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rollout_upload.py +0 -0
  622. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rubric_checks.py +0 -0
  623. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_rubric_config.py +0 -0
  624. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_runtime.py +0 -0
  625. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_runtime_capabilities.py +0 -0
  626. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_runtime_config_wired.py +0 -0
  627. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_runtime_live_sandbox.py +0 -0
  628. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_exec_secret_handling.py +0 -0
  629. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_hardening.py +0 -0
  630. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
  631. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_live_process.py +0 -0
  632. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_multi_service.py +0 -0
  633. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_prebuilt_validation.py +0 -0
  634. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_protocol.py +0 -0
  635. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_provider_registry_drift.py +0 -0
  636. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_setup.py +0 -0
  637. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_snapshot_contract.py +0 -0
  638. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_upload_symlink.py +0 -0
  639. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sandbox_verifier_workspace.py +0 -0
  640. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_scene.py +0 -0
  641. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_scene_outbox_trial.py +0 -0
  642. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_scene_parallel_group.py +0 -0
  643. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_scene_result_aggregation.py +0 -0
  644. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_scoring.py +0 -0
  645. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sdk_internals.py +0 -0
  646. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sdk_lockdown.py +0 -0
  647. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sdk_run_alias.py +0 -0
  648. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_sealed_channel_container.py +0 -0
  649. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_self_gen_cli.py +0 -0
  650. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_self_gen_export_error_channel.py +0 -0
  651. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_self_gen_export_failures.py +0 -0
  652. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_self_gen_orchestration.py +0 -0
  653. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_session_factory_runtime.py +0 -0
  654. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_session_request_permission_dispatch.py +0 -0
  655. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_eval.py +0 -0
  656. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_eval_dryrun.py +0 -0
  657. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_eval_integration.py +0 -0
  658. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_eval_sweep.py +0 -0
  659. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_eval_traversal.py +0 -0
  660. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_invocation_artifacts.py +0 -0
  661. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skill_policy.py +0 -0
  662. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skills.py +0 -0
  663. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skills_dir_agent_home_link.py +0 -0
  664. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skillsbench_conversion_conformance.py +0 -0
  665. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_skillsbench_harbor_run_suite.py +0 -0
  666. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_smoke.py +0 -0
  667. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_smoke_wiring.py +0 -0
  668. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_source_adapters.py +0 -0
  669. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_subscription_auth.py +0 -0
  670. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_check_eval_consistency.py +0 -0
  671. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_config.py +0 -0
  672. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_digest.py +0 -0
  673. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_document.py +0 -0
  674. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_download.py +0 -0
  675. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_export.py +0 -0
  676. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_output_format.py +0 -0
  677. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_package.py +0 -0
  678. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_task_runtime_primitive.py +0 -0
  679. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_tasks.py +0 -0
  680. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_token_usage_normalization.py +0 -0
  681. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trace_import_cli.py +0 -0
  682. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trace_task_gen_traversal.py +0 -0
  683. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trace_to_task_evidence.py +0 -0
  684. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traces_huggingface.py +0 -0
  685. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traces_parsers.py +0 -0
  686. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traces_task_gen.py +0 -0
  687. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_train_cli.py +0 -0
  688. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_train_mode_artifact_emission.py +0 -0
  689. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_train_trl_cli.py +0 -0
  690. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_report.py +0 -0
  691. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_staging_phases.py +0 -0
  692. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_tui.py +0 -0
  693. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_upload_cli.py +0 -0
  694. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_traj_upload_skill.py +0 -0
  695. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trajectory_integration.py +0 -0
  696. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trajectory_streaming.py +0 -0
  697. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trajectory_upload_layout.py +0 -0
  698. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trajectory_upload_service.py +0 -0
  699. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trial_agent_timeout_verify.py +0 -0
  700. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trial_install_agent_timeout.py +0 -0
  701. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trial_litellm_runtime.py +0 -0
  702. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_trl_integration.py +0 -0
  703. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_usage_litellm.py +0 -0
  704. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_usage_required.py +0 -0
  705. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_usage_tracking.py +0 -0
  706. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_user.py +0 -0
  707. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_v06_guard_ports.py +0 -0
  708. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_document.py +0 -0
  709. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_multi_container.py +0 -0
  710. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_output.py +0 -0
  711. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_output_freshness.py +0 -0
  712. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_strategies.py +0 -0
  713. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verifier_wedge_retry.py +0 -0
  714. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_verify.py +0 -0
  715. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_viewer_confirm.py +0 -0
  716. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_workflow_action_pinning.py +0 -0
  717. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/test_yaml_config.py +0 -0
  718. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/__init__.py +0 -0
  719. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export.py +0 -0
  720. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export_adp.py +0 -0
  721. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export_atif.py +0 -0
  722. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export_common.py +0 -0
  723. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export_nan_handling.py +0 -0
  724. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_export_prime_sft.py +0 -0
  725. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_redaction.py +0 -0
  726. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_step_granularity.py +0 -0
  727. {benchflow-0.7.4 → benchflow-0.7.6.dev2055}/tests/trajectories/test_tree.py +0 -0
@@ -2,6 +2,27 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## 0.7.5 — 2026-08-19
6
+
7
+ ### Added
8
+
9
+ - **Weighted rubric-review contract (v0.2).** `bench review` now accepts the
10
+ versionless `rubric.json` shape introduced by FrontierPhysics PR #109, where
11
+ every criterion adds strict `blocker` (`0` or `1`) and `weight` (`1` through
12
+ `10`) fields. Binary blockers gate publication; non-blockers receive weighted
13
+ `0` / `1` / `2` scores with raw and gated quality plus publication bands in
14
+ the report. Blocker weights are excluded from quality, and the wrapper reward
15
+ remains a structural-validity signal. Existing three-field v0.1 rubrics keep
16
+ their `pass` / `fail` / `not_applicable` behavior unchanged. Docker runs now
17
+ probe whether verifier-log bind mounts are genuinely visible to the container
18
+ and fall back to explicit copy-out when path translation is unavailable.
19
+
20
+ ### Fixed
21
+
22
+ - **Linked-worktree `.git` pointer files stay out of workspace attachments.**
23
+ Workspace capture now excludes `.git` files as well as directories, preventing
24
+ local absolute worktree metadata from entering uploaded archives. (#1032)
25
+
5
26
  ## 0.7.4 — 2026-08-16
6
27
 
7
28
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: benchflow
3
- Version: 0.7.4
3
+ Version: 0.7.6.dev2055
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.7.4"
3
+ version = "0.7.6.dev2055"
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"
@@ -61,9 +61,12 @@ from benchflow.monitor import (
61
61
  MonitorResult,
62
62
  )
63
63
  from benchflow.review import (
64
+ PublicationDecision,
64
65
  ReviewReport,
65
66
  ReviewRubricError,
67
+ ReviewScoring,
66
68
  run_reviews,
69
+ score_weighted_review,
67
70
  )
68
71
  from benchflow.review import Rubric as ReviewRubric
69
72
  from benchflow.review import RubricCriterion as ReviewRubricCriterion
@@ -169,11 +172,14 @@ __all__ = [
169
172
  "load_rubric_json",
170
173
  "load_rubric_toml",
171
174
  "ReviewReport",
175
+ "PublicationDecision",
172
176
  "ReviewRubric",
173
177
  "ReviewRubricCriterion",
174
178
  "ReviewRubricError",
179
+ "ReviewScoring",
175
180
  "load_review_rubric",
176
181
  "run_reviews",
182
+ "score_weighted_review",
177
183
  "Sandbox",
178
184
  "SandboxExecResult",
179
185
  "SandboxImage",
@@ -146,10 +146,10 @@ def task_digest(task_dir: Path) -> str:
146
146
  def _check_review_rubric(verifier_dir: Path, *, verifier_label: str) -> list[str]:
147
147
  """Validate a review ``rubric.json`` when the task ships one.
148
148
 
149
- Review rubrics are ``{"criteria": [{name, description, guidance}]}``
150
- JSON documents. A ``rubric.json`` that is not shaped like that (for
151
- example an llm-judge rubric owned by the verifier-strategy machinery)
152
- is not checked here.
149
+ Review rubrics use either the legacy ``{name, description, guidance}``
150
+ criterion shape or the weighted shape that adds ``blocker`` and
151
+ ``weight``. A ``rubric.json`` in the full llm-judge dialect is owned by
152
+ the verifier-strategy machinery and is not checked here.
153
153
  """
154
154
  from benchflow.review.config import (
155
155
  ReviewRubricError,
@@ -25,43 +25,88 @@ _REVIEW_OUTCOME_STYLES = {
25
25
  "not_applicable": "grey50",
26
26
  }
27
27
 
28
+ _REVIEW_SCORE_STYLES = {
29
+ 0: "red",
30
+ 1: "yellow",
31
+ 2: "green",
32
+ }
33
+
28
34
 
29
35
  def _render_trial_review(trial) -> None:
30
36
  table = Table(title=f"Review: {escape(str(trial.trial_name))}", show_lines=True)
31
37
  table.add_column("Criterion")
32
- table.add_column("Outcome")
38
+ table.add_column("Result")
33
39
  table.add_column("Explanation")
34
40
  for name, check in (trial.checks or {}).items():
35
- outcome = str(check.get("outcome", ""))
41
+ if "score" in check:
42
+ raw_score = check.get("score")
43
+ result = str(raw_score)
44
+ style = (
45
+ _REVIEW_SCORE_STYLES.get(raw_score, "white")
46
+ if type(raw_score) is int
47
+ else "white"
48
+ )
49
+ else:
50
+ result = str(check.get("outcome", ""))
51
+ style = _REVIEW_OUTCOME_STYLES.get(result, "white")
36
52
  table.add_row(
37
53
  escape(str(name).replace("_", " ").title()),
38
- escape(outcome),
54
+ escape(result),
39
55
  escape(str(check.get("explanation", ""))),
40
- style=_REVIEW_OUTCOME_STYLES.get(outcome, "white"),
56
+ style=style,
41
57
  )
42
58
  if trial.summary:
43
59
  console.print(f"\n[bold]Summary:[/bold] {escape(str(trial.summary))}\n")
60
+ scoring = getattr(trial, "scoring", None)
61
+ if scoring is not None:
62
+ console.print(
63
+ "[bold]Weighted quality:[/bold] "
64
+ f"{scoring.raw_quality:.3f} raw / {scoring.gated_quality:.3f} gated "
65
+ f"— {escape(scoring.decision.value)}\n"
66
+ )
44
67
  console.print(table)
45
68
 
46
69
 
47
70
  def _render_review_overview(trials) -> None:
48
71
  table = Table(title="Rubric Reviews", show_lines=True)
49
- for column in ("Run", "Pass", "Fail", "N/A", "Valid"):
72
+ for column in ("Run", "Pass", "Fail", "N/A", "Quality", "Decision", "Valid"):
50
73
  table.add_column(column)
51
74
  for trial in trials:
52
75
  if trial.error and not trial.checks:
53
76
  table.add_row(
54
- escape(str(trial.trial_name)), "-", "-", "-", "no", style="red"
77
+ escape(str(trial.trial_name)),
78
+ "-",
79
+ "-",
80
+ "-",
81
+ "-",
82
+ "-",
83
+ "no",
84
+ style="red",
55
85
  )
56
86
  continue
57
87
  counts = trial.outcome_counts()
88
+ scoring = getattr(trial, "scoring", None)
89
+ quality = f"{scoring.raw_quality:.3f}" if scoring is not None else "-"
90
+ decision = scoring.decision.value if scoring is not None else "-"
91
+ if (
92
+ not trial.review_valid
93
+ or counts["fail"]
94
+ or (scoring is not None and decision == "not_publishable")
95
+ ):
96
+ style = "red"
97
+ elif scoring is not None and decision == "presentable_with_revisions":
98
+ style = "yellow"
99
+ else:
100
+ style = "white"
58
101
  table.add_row(
59
102
  escape(str(trial.trial_name)),
60
103
  str(counts["pass"]),
61
104
  str(counts["fail"]),
62
105
  str(counts["not_applicable"]),
106
+ quality,
107
+ escape(decision),
63
108
  "yes" if trial.review_valid else "no",
64
- style="red" if counts["fail"] or not trial.review_valid else "white",
109
+ style=style,
65
110
  )
66
111
  console.print(table)
67
112
  for trial in trials:
@@ -72,6 +72,9 @@ WORKSPACE_EXCLUDED_DIRS = frozenset(
72
72
  # are uploaded as-is (no content redaction), so obvious secret carriers stay
73
73
  # on the contributor's machine.
74
74
  WORKSPACE_EXCLUDED_FILES = (
75
+ # A linked git worktree's ``.git`` is a pointer FILE (not a directory)
76
+ # carrying a local absolute path; the directory case is excluded above.
77
+ re.compile(r"^\.git$", re.IGNORECASE),
75
78
  re.compile(r"^\.env(\..+)?$", re.IGNORECASE),
76
79
  re.compile(r".*\.(pem|key|p12|pfx|keystore)$", re.IGNORECASE),
77
80
  re.compile(r"^id_(rsa|dsa|ecdsa|ed25519)(\..+)?$", re.IGNORECASE),
@@ -1,10 +1,10 @@
1
1
  """Rubric review — detached agentic grading of finished rollouts.
2
2
 
3
- A rubric (contract **v0.1**) is a JSON object containing a ``criteria`` list;
4
- each criterion has ``name``, ``description``, and ``guidance``. A reviewer
5
- agent reads a finished rollout's records inside its own sandbox and answers
6
- each criterion with ``pass`` / ``fail`` / ``not_applicable`` plus an
7
- explanation.
3
+ A rubric is a JSON object containing a ``criteria`` list. Legacy v0.1
4
+ criteria have ``name``, ``description``, and ``guidance`` and receive
5
+ pass/fail/not-applicable judgments. Weighted v0.2 criteria additionally have
6
+ strict ``blocker`` and ``weight`` integers: blockers receive pass/fail gates,
7
+ while non-blockers receive 0/1/2 scores that Benchflow aggregates host-side.
8
8
 
9
9
  Reviews run *after* rollouts, from their host-side directories, as ordinary
10
10
  rollouts of throwaway wrapper tasks (:mod:`benchflow.review.wrapper`), so
@@ -23,14 +23,19 @@ Public surface:
23
23
 
24
24
  from benchflow.review.config import (
25
25
  DEFAULT_RUBRIC_PATH,
26
+ LEGACY_REVIEW_RUBRIC_CONTRACT,
26
27
  REVIEW_RESULT_FILENAME,
27
28
  REVIEW_RUBRIC_CONTRACT,
28
29
  REVIEW_RUBRIC_FILENAME,
30
+ WEIGHTED_REVIEW_RUBRIC_CONTRACT,
31
+ BlockerCriterionCheck,
32
+ BlockerOutcomeValue,
29
33
  CriterionCheck,
30
34
  ReviewOutcomeValue,
31
35
  ReviewRubricError,
32
36
  Rubric,
33
37
  RubricCriterion,
38
+ ScoredCriterionCheck,
34
39
  build_criteria_guidance,
35
40
  build_review_response_model,
36
41
  find_task_rubric,
@@ -44,21 +49,37 @@ from benchflow.review.runner import (
44
49
  discover_rollouts,
45
50
  run_reviews,
46
51
  )
52
+ from benchflow.review.scoring import (
53
+ PUBLISHABLE_QUALITY,
54
+ REVISIONS_QUALITY,
55
+ PublicationDecision,
56
+ ReviewScoring,
57
+ score_weighted_review,
58
+ )
47
59
  from benchflow.review.wrapper import assemble_review_task
48
60
 
49
61
  __all__ = [
50
62
  "DEFAULT_RUBRIC_PATH",
63
+ "LEGACY_REVIEW_RUBRIC_CONTRACT",
64
+ "PUBLISHABLE_QUALITY",
51
65
  "REVIEW_RUBRIC_CONTRACT",
52
66
  "REVIEW_REPORT_FILENAME",
53
67
  "REVIEW_RESULT_FILENAME",
54
68
  "REVIEW_RUBRIC_FILENAME",
69
+ "REVISIONS_QUALITY",
70
+ "WEIGHTED_REVIEW_RUBRIC_CONTRACT",
71
+ "BlockerCriterionCheck",
72
+ "BlockerOutcomeValue",
55
73
  "CriterionCheck",
74
+ "PublicationDecision",
56
75
  "ReviewOutcomeValue",
57
76
  "ReviewReport",
58
77
  "ReviewRubricError",
59
78
  "ReviewRunError",
79
+ "ReviewScoring",
60
80
  "Rubric",
61
81
  "RubricCriterion",
82
+ "ScoredCriterionCheck",
62
83
  "TrialReview",
63
84
  "assemble_review_task",
64
85
  "build_criteria_guidance",
@@ -67,4 +88,5 @@ __all__ = [
67
88
  "find_task_rubric",
68
89
  "load_rubric",
69
90
  "run_reviews",
91
+ "score_weighted_review",
70
92
  ]
@@ -0,0 +1,359 @@
1
+ """Rubric schemas and loading for detached post-run review.
2
+
3
+ The current weighted contract (v0.2) extends each criterion with two strict
4
+ integer fields::
5
+
6
+ {
7
+ "criteria": [
8
+ {
9
+ "name": "method_soundness",
10
+ "blocker": 0,
11
+ "weight": 5,
12
+ "description": "Author-facing note; never shown to the reviewer.",
13
+ "guidance": "Score 2 when ...; 1 when ...; 0 when ..."
14
+ }
15
+ ]
16
+ }
17
+
18
+ ``blocker: 1`` criteria receive a binary pass/fail judgment. ``blocker: 0``
19
+ criteria receive an integer score from 0 to 2 and contribute to a weighted
20
+ research-quality score. ``weight`` is an integer from 1 to 10.
21
+
22
+ Versionless v0.1 rubrics remain supported for compatibility. They omit both
23
+ ``blocker`` and ``weight`` and retain pass/fail/not-applicable judgments. A
24
+ single rubric may not mix contracts, and a criterion may not provide only one
25
+ of the v0.2 fields; both cases fail closed instead of guessing intent.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import json
31
+ import keyword
32
+ from enum import StrEnum
33
+ from pathlib import Path
34
+ from typing import Annotated, Any, Self
35
+
36
+ from pydantic import (
37
+ AfterValidator,
38
+ BaseModel,
39
+ ConfigDict,
40
+ Field,
41
+ ValidationError,
42
+ create_model,
43
+ field_validator,
44
+ model_validator,
45
+ )
46
+
47
+ LEGACY_REVIEW_RUBRIC_CONTRACT = "v0.1"
48
+ WEIGHTED_REVIEW_RUBRIC_CONTRACT = "v0.2"
49
+ # Backward-compatible public alias. New code that needs to distinguish
50
+ # contracts should use the explicit LEGACY_* and WEIGHTED_* constants.
51
+ REVIEW_RUBRIC_CONTRACT = LEGACY_REVIEW_RUBRIC_CONTRACT
52
+ REVIEW_RUBRIC_FILENAME = "rubric.json"
53
+ REVIEW_RESULT_FILENAME = "review-result.json"
54
+
55
+ DEFAULT_RUBRIC_PATH = Path(__file__).parent / "default-rubric.json"
56
+
57
+
58
+ def _non_blank(value: str) -> str:
59
+ if not value.strip():
60
+ raise ValueError("must contain non-whitespace text")
61
+ return value
62
+
63
+
64
+ NonBlankText = Annotated[
65
+ str,
66
+ Field(min_length=1),
67
+ AfterValidator(_non_blank),
68
+ ]
69
+
70
+
71
+ class ReviewRubricError(ValueError):
72
+ """Raised when a rubric file cannot be loaded or is not a valid rubric."""
73
+
74
+
75
+ class RubricCriterion(BaseModel):
76
+ """One criterion the reviewer grades."""
77
+
78
+ model_config = ConfigDict(extra="forbid")
79
+
80
+ name: str
81
+ description: str
82
+ guidance: str
83
+ blocker: int | None = Field(default=None, strict=True, ge=0, le=1)
84
+ weight: int | None = Field(default=None, strict=True, ge=1, le=10)
85
+
86
+ @field_validator("name")
87
+ @classmethod
88
+ def _name_is_usable_field(cls, value: str) -> str:
89
+ # The name becomes a dynamically created model field, so anything the
90
+ # schema library reserves either crashes model construction
91
+ # (``model_config``), trips protected-namespace rules
92
+ # (``model_dump``), or is silently dropped from the generated schema
93
+ # (private/dunder names) -- yielding an impossible reviewer/verifier
94
+ # contract instead of a loud failure.
95
+ if not value.isidentifier() or keyword.iskeyword(value):
96
+ raise ValueError(
97
+ f"criterion name {value!r} must be a valid, non-keyword "
98
+ "Python identifier (it becomes a structured-output field)"
99
+ )
100
+ if value.startswith("_"):
101
+ raise ValueError(
102
+ f"criterion name {value!r} must not start with '_': private "
103
+ "and dunder names are dropped from the generated schema"
104
+ )
105
+ if value.startswith("model_"):
106
+ raise ValueError(
107
+ f"criterion name {value!r} must not start with 'model_': "
108
+ "that namespace is reserved by the schema library"
109
+ )
110
+ if hasattr(BaseModel, value):
111
+ raise ValueError(
112
+ f"criterion name {value!r} collides with reserved schema "
113
+ f"attribute {value!r}; choose another name"
114
+ )
115
+ return value
116
+
117
+ @model_validator(mode="after")
118
+ def _scoring_fields_are_paired(self) -> Self:
119
+ blocker_supplied = "blocker" in self.model_fields_set
120
+ weight_supplied = "weight" in self.model_fields_set
121
+ if blocker_supplied != weight_supplied:
122
+ raise ValueError(
123
+ "criterion must provide both blocker and weight for the v0.2 "
124
+ "contract, or omit both for legacy v0.1"
125
+ )
126
+ if blocker_supplied and (self.blocker is None or self.weight is None):
127
+ raise ValueError(
128
+ "blocker and weight must be strict integers for the v0.2 "
129
+ "contract; null is not allowed"
130
+ )
131
+ return self
132
+
133
+ @property
134
+ def is_legacy(self) -> bool:
135
+ return self.blocker is None
136
+
137
+ @property
138
+ def is_blocker(self) -> bool:
139
+ return self.blocker == 1
140
+
141
+ def metadata(self) -> dict[str, str | int | None]:
142
+ """Return the non-prompt criterion contract recorded in artifacts."""
143
+
144
+ return {
145
+ "name": self.name,
146
+ "blocker": self.blocker,
147
+ "weight": self.weight,
148
+ }
149
+
150
+
151
+ class Rubric(BaseModel):
152
+ """A parsed review rubric."""
153
+
154
+ model_config = ConfigDict(extra="forbid")
155
+
156
+ criteria: list[RubricCriterion] = Field(min_length=1)
157
+
158
+ @field_validator("criteria")
159
+ @classmethod
160
+ def _criteria_are_coherent(
161
+ cls, value: list[RubricCriterion]
162
+ ) -> list[RubricCriterion]:
163
+ seen: set[str] = set()
164
+ duplicates: set[str] = set()
165
+ for criterion in value:
166
+ if criterion.name in seen:
167
+ duplicates.add(criterion.name)
168
+ seen.add(criterion.name)
169
+ if duplicates:
170
+ raise ValueError(
171
+ f"criterion names must be unique; duplicated: {sorted(duplicates)} "
172
+ "(duplicate names would silently collapse into one "
173
+ "structured-output field)"
174
+ )
175
+ contracts = {criterion.is_legacy for criterion in value}
176
+ if len(contracts) != 1:
177
+ raise ValueError(
178
+ "all criteria must use one rubric contract; legacy v0.1 and "
179
+ "weighted v0.2 criteria cannot be mixed"
180
+ )
181
+ if not value[0].is_legacy and not any(
182
+ not criterion.is_blocker for criterion in value
183
+ ):
184
+ raise ValueError(
185
+ "weighted v0.2 rubrics require at least one scored "
186
+ "(blocker: 0) criterion"
187
+ )
188
+ return value
189
+
190
+ @property
191
+ def contract(self) -> str:
192
+ return (
193
+ LEGACY_REVIEW_RUBRIC_CONTRACT
194
+ if self.criteria[0].is_legacy
195
+ else WEIGHTED_REVIEW_RUBRIC_CONTRACT
196
+ )
197
+
198
+ @property
199
+ def is_weighted(self) -> bool:
200
+ return self.contract == WEIGHTED_REVIEW_RUBRIC_CONTRACT
201
+
202
+ def metadata(self) -> dict[str, Any]:
203
+ """Return the rubric contract carried into wrapper/report artifacts."""
204
+
205
+ return {
206
+ "contract": self.contract,
207
+ "criteria": [criterion.metadata() for criterion in self.criteria],
208
+ }
209
+
210
+
211
+ class ReviewOutcomeValue(StrEnum):
212
+ """Closed outcome vocabulary for one legacy v0.1 criterion."""
213
+
214
+ PASS = "pass"
215
+ FAIL = "fail"
216
+ NOT_APPLICABLE = "not_applicable"
217
+
218
+
219
+ class CriterionCheck(BaseModel):
220
+ """The reviewer's answer for one legacy v0.1 criterion."""
221
+
222
+ explanation: NonBlankText
223
+ outcome: ReviewOutcomeValue
224
+
225
+
226
+ class BlockerOutcomeValue(StrEnum):
227
+ """Closed outcome vocabulary for a v0.2 blocker."""
228
+
229
+ PASS = "pass"
230
+ FAIL = "fail"
231
+
232
+
233
+ class BlockerCriterionCheck(BaseModel):
234
+ """The reviewer's binary answer for a v0.2 blocker."""
235
+
236
+ model_config = ConfigDict(extra="forbid")
237
+
238
+ explanation: NonBlankText
239
+ outcome: BlockerOutcomeValue
240
+
241
+
242
+ class ScoredCriterionCheck(BaseModel):
243
+ """The reviewer's 0-2 answer for a weighted v0.2 criterion."""
244
+
245
+ model_config = ConfigDict(extra="forbid")
246
+
247
+ explanation: NonBlankText
248
+ score: int = Field(strict=True, ge=0, le=2)
249
+
250
+
251
+ def load_rubric(path: Path | None = None) -> Rubric:
252
+ """Load a rubric from a JSON file, or the built-in default rubric.
253
+
254
+ Only JSON is accepted. Every criterion must consistently use either the
255
+ legacy v0.1 three-field shape or the weighted v0.2 five-field shape.
256
+ """
257
+
258
+ rubric_path = path if path is not None else DEFAULT_RUBRIC_PATH
259
+ if rubric_path.suffix.lower() != ".json":
260
+ raise ReviewRubricError(
261
+ f"unsupported rubric format {rubric_path.suffix!r}: rubrics are JSON files"
262
+ )
263
+ try:
264
+ text = rubric_path.read_text(encoding="utf-8")
265
+ except OSError as exc:
266
+ raise ReviewRubricError(f"cannot read {rubric_path}: {exc}") from exc
267
+ try:
268
+ data = json.loads(text)
269
+ except json.JSONDecodeError as exc:
270
+ raise ReviewRubricError(f"{rubric_path} is not valid JSON: {exc}") from exc
271
+ try:
272
+ return Rubric.model_validate(data)
273
+ except ValidationError as exc:
274
+ raise ReviewRubricError(f"{rubric_path} is not a valid rubric: {exc}") from exc
275
+
276
+
277
+ def is_review_rubric_file(path: Path) -> bool:
278
+ """Whether ``path`` claims either detached-review rubric contract.
279
+
280
+ ``rubric.json`` is an overloaded filename: llm-judge verifier rubrics
281
+ use entries carrying the full ``{id, match_criteria}`` shape. Only that
282
+ dialect is disclaimed; everything else in this slot is claimed and then
283
+ validated loudly by :func:`load_rubric`, so malformed review rubrics can
284
+ never silently fall back to the built-in default.
285
+ """
286
+
287
+ try:
288
+ data = json.loads(path.read_text(encoding="utf-8"))
289
+ except (OSError, UnicodeDecodeError, json.JSONDecodeError):
290
+ return True
291
+ if not isinstance(data, dict):
292
+ return True
293
+ criteria = data.get("criteria")
294
+ if not isinstance(criteria, list):
295
+ return True
296
+
297
+ def is_judge_entry(entry: object) -> bool:
298
+ return isinstance(entry, dict) and {"id", "match_criteria"} <= set(entry)
299
+
300
+ return not (criteria and all(is_judge_entry(entry) for entry in criteria))
301
+
302
+
303
+ def find_task_rubric(task_path: Path) -> Path | None:
304
+ """Return the detached-review rubric a task ships, if any."""
305
+
306
+ for tests_dir_name in ("verifier", "tests"):
307
+ candidate = task_path / tests_dir_name / REVIEW_RUBRIC_FILENAME
308
+ if candidate.is_file() and is_review_rubric_file(candidate):
309
+ return candidate
310
+ return None
311
+
312
+
313
+ def build_criteria_guidance(rubric: Rubric) -> str:
314
+ """Render the criterion guidance lines included in the reviewer prompt."""
315
+
316
+ if not rubric.is_weighted:
317
+ return "\n".join(
318
+ f"- {criterion.name}: {criterion.guidance}" for criterion in rubric.criteria
319
+ )
320
+
321
+ return "\n".join(
322
+ (
323
+ f"- {criterion.name} [BLOCKER; answer pass or fail; weight "
324
+ f"{criterion.weight} does not enter weighted quality]: "
325
+ f"{criterion.guidance}"
326
+ if criterion.is_blocker
327
+ else f"- {criterion.name} [SCORED; weight {criterion.weight}; "
328
+ f"answer 0, 1, or 2]: {criterion.guidance}"
329
+ )
330
+ for criterion in rubric.criteria
331
+ )
332
+
333
+
334
+ def build_review_response_model(rubric: Rubric) -> type[BaseModel]:
335
+ """Build the structured-output model for one rollout review."""
336
+
337
+ checks_fields: dict[str, Any] = {}
338
+ for criterion in rubric.criteria:
339
+ check_model: type[BaseModel]
340
+ if criterion.is_legacy:
341
+ check_model = CriterionCheck
342
+ elif criterion.is_blocker:
343
+ check_model = BlockerCriterionCheck
344
+ else:
345
+ check_model = ScoredCriterionCheck
346
+ checks_fields[criterion.name] = (check_model, ...)
347
+ extra_policy = "forbid" if rubric.is_weighted else "ignore"
348
+ checks_model = create_model(
349
+ "ReviewChecks",
350
+ __config__=ConfigDict(extra="forbid"),
351
+ **checks_fields,
352
+ )
353
+ return create_model(
354
+ "ReviewResponse",
355
+ __config__=ConfigDict(extra=extra_policy),
356
+ trial_name=(str, ...),
357
+ summary=(NonBlankText, ...),
358
+ checks=(checks_model, ...),
359
+ )
@@ -62,7 +62,21 @@ OUTPUT_TEMPLATE = """When you are done, write your answer as JSON to {result_pat
62
62
 
63
63
  {output_schema}
64
64
 
65
- "trial_name" must be exactly {trial_name_json}. Every criterion listed in the schema must appear in "checks" with an "outcome" of "pass", "fail", or "not_applicable" and a non-empty "explanation". Write the file and nothing else; do not print the JSON instead of writing it."""
65
+ "trial_name" must be exactly {trial_name_json}. {judgment_contract} Write the file and nothing else; do not print the JSON instead of writing it."""
66
+
67
+ LEGACY_JUDGMENT_CONTRACT = (
68
+ 'Every criterion listed in the schema must appear in "checks" with an '
69
+ '"outcome" of "pass", "fail", or "not_applicable" and a non-empty '
70
+ '"explanation".'
71
+ )
72
+
73
+ WEIGHTED_JUDGMENT_CONTRACT = (
74
+ 'Every criterion listed in the schema must appear in "checks" with a '
75
+ 'non-empty "explanation". BLOCKER criteria require an "outcome" of '
76
+ '"pass" or "fail". SCORED criteria require an integer "score" of 0, 1, '
77
+ "or 2. Do not calculate an aggregate score; Benchflow derives it "
78
+ "deterministically from the individual judgments and rubric weights."
79
+ )
66
80
 
67
81
 
68
82
  def render_task_section(task_path: str | None) -> str:
@@ -97,6 +111,11 @@ def render_review_instruction(
97
111
  "result_path": result_path,
98
112
  "trial_name_json": json.dumps(trial_name),
99
113
  "output_schema": json.dumps(output_schema or {}, indent=2),
114
+ "judgment_contract": (
115
+ WEIGHTED_JUDGMENT_CONTRACT
116
+ if rubric.is_weighted
117
+ else LEGACY_JUDGMENT_CONTRACT
118
+ ),
100
119
  }
101
120
  )
102
121
  return f"{body.rstrip()}\n\n{output.strip()}\n"