benchflow 0.7.8.dev2342__tar.gz → 0.7.9.dev2354__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 (795) hide show
  1. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/CHANGELOG.md +38 -0
  2. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/PKG-INFO +1 -1
  3. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/pyproject.toml +1 -1
  4. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/evidence.py +25 -10
  5. benchflow-0.7.9.dev2354/src/benchflow/review/evidence_runtime.py +49 -0
  6. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/__init__.py +4 -0
  7. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_review.py +9 -0
  8. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore.py +98 -10
  9. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/protocol.py +10 -0
  10. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agentcore_parallel.py +155 -0
  11. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agentcore_sandbox.py +101 -0
  12. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_automatic.py +48 -0
  13. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_evidence.py +79 -6
  14. benchflow-0.7.9.dev2354/tests/test_review_evidence_runtime.py +107 -0
  15. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/.gitignore +0 -0
  16. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/LICENSE +0 -0
  17. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/README.md +0 -0
  18. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/__init__.py +0 -0
  19. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_dotenv.py +0 -0
  20. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_paths.py +0 -0
  21. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_run.py +0 -0
  22. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_types.py +0 -0
  23. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/__init__.py +0 -0
  24. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/benchmark_repos.py +0 -0
  25. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/build_context_stage.py +0 -0
  26. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/config.py +0 -0
  27. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/config_override.py +0 -0
  28. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/config_redaction.py +0 -0
  29. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/content_address.py +0 -0
  30. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/dataset_registry.py +0 -0
  31. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/env_registry.py +0 -0
  32. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/evaluation_results.py +0 -0
  33. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/hf_datasets.py +0 -0
  34. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/json_safe.py +0 -0
  35. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/learner_memory.py +0 -0
  36. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/live_activity.py +0 -0
  37. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/result_metadata.py +0 -0
  38. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/result_paths.py +0 -0
  39. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/reward_events.py +0 -0
  40. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/scoring.py +0 -0
  41. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/source_provenance.py +0 -0
  42. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
  43. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
  44. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
  45. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
  46. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
  47. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/text.py +0 -0
  48. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/_utils/yaml_loader.py +0 -0
  49. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/__init__.py +0 -0
  50. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/client.py +0 -0
  51. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/container_transport.py +0 -0
  52. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/runtime.py +0 -0
  53. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/selection.py +0 -0
  54. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/session.py +0 -0
  55. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/timeout_cleanup.py +0 -0
  56. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/transport.py +0 -0
  57. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/types.py +0 -0
  58. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/acp/watchdog.py +0 -0
  59. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/__init__.py +0 -0
  60. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/_toolathlon.py +0 -0
  61. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/_toolathlon_container.py +0 -0
  62. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
  63. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
  64. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/_toolathlon_services.py +0 -0
  65. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/harbor.py +0 -0
  66. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/inbound.py +0 -0
  67. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/inspect_ai.py +0 -0
  68. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/ors.py +0 -0
  69. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/resources/__init__.py +0 -0
  70. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
  71. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
  72. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/adapters/source.py +0 -0
  73. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agent_router.py +0 -0
  74. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agent_router_guide.py +0 -0
  75. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agent_router_parity.py +0 -0
  76. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agent_router_scaffold.py +0 -0
  77. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/__init__.py +0 -0
  78. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/codex_config.py +0 -0
  79. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/credentials.py +0 -0
  80. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
  81. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/env.py +0 -0
  82. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/errors.py +0 -0
  83. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
  84. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/install.py +0 -0
  85. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/manifest.py +0 -0
  86. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
  87. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/pi_acp_launcher.py +0 -0
  88. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/protocol.py +0 -0
  89. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/providers.py +0 -0
  90. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/registry.py +0 -0
  91. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/agents/remote_manifests.py +0 -0
  92. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/branch.py +0 -0
  93. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/__init__.py +0 -0
  94. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_failure_evidence.py +0 -0
  95. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_hosted_env.py +0 -0
  96. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_live_progress.py +0 -0
  97. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_options.py +0 -0
  98. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_shared.py +0 -0
  99. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_traj_tui.py +0 -0
  100. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/_traj_upload_ui.py +0 -0
  101. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/adopt.py +0 -0
  102. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/agent.py +0 -0
  103. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/continue_cmd.py +0 -0
  104. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/environment.py +0 -0
  105. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/eval_artifacts.py +0 -0
  106. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/eval_lift.py +0 -0
  107. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/hub.py +0 -0
  108. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/main.py +0 -0
  109. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/monitor.py +0 -0
  110. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/rescore.py +0 -0
  111. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/review.py +0 -0
  112. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/reviewer_options.py +0 -0
  113. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/sandbox.py +0 -0
  114. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/skills.py +0 -0
  115. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/tasks.py +0 -0
  116. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/trace_import.py +0 -0
  117. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/train.py +0 -0
  118. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/cli/traj.py +0 -0
  119. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/__init__.py +0 -0
  120. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/batch.py +0 -0
  121. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/orchestrator.py +0 -0
  122. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/replay_proxy.py +0 -0
  123. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/run_folder.py +0 -0
  124. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
  125. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/contracts/__init__.py +0 -0
  126. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/contracts/planes.py +0 -0
  127. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/contracts/user.py +0 -0
  128. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/demo_task/environment/Dockerfile +0 -0
  129. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/demo_task/instruction.md +0 -0
  130. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/demo_task/task.md +0 -0
  131. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/demo_task/task.toml +0 -0
  132. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/demo_task/tests/test.sh +0 -0
  133. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/diagnostics.py +0 -0
  134. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/__init__.py +0 -0
  135. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
  136. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
  137. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/manifest.py +0 -0
  138. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/manifest_env.py +0 -0
  139. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/protocol.py +0 -0
  140. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/environment/readiness.py +0 -0
  141. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/eval_artifacts.py +0 -0
  142. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/eval_lift.py +0 -0
  143. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/eval_plan.py +0 -0
  144. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/eval_sharding.py +0 -0
  145. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/eval_worker.py +0 -0
  146. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/evaluation.py +0 -0
  147. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/experimental/__init__.py +0 -0
  148. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/experimental/mcp/__init__.py +0 -0
  149. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/experimental/mcp/hooks.py +0 -0
  150. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
  151. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/hosted_env.py +0 -0
  152. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/hub/__init__.py +0 -0
  153. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/hub/harbor_registry.py +0 -0
  154. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/integrations/__init__.py +0 -0
  155. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/integrations/trl/__init__.py +0 -0
  156. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/integrations/trl/spec.py +0 -0
  157. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/learner_skills.py +0 -0
  158. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/learner_store.py +0 -0
  159. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/loop_strategies.py +0 -0
  160. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/loop_sweep.py +0 -0
  161. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/metrics.py +0 -0
  162. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/models.py +0 -0
  163. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/monitor.py +0 -0
  164. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/__init__.py +0 -0
  165. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
  166. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
  167. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_config.py +0 -0
  168. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_gemini_passthrough_patch.py +0 -0
  169. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_logging.py +0 -0
  170. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/litellm_runtime.py +0 -0
  171. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/providers/runtime.py +0 -0
  172. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/__init__.py +0 -0
  173. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/_progress.py +0 -0
  174. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/azure_blob.py +0 -0
  175. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/broker.py +0 -0
  176. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/huggingface.py +0 -0
  177. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/redact.py +0 -0
  178. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/traj_capture.py +0 -0
  179. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/publish/traj_report.py +0 -0
  180. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/py.typed +0 -0
  181. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/__init__.py +0 -0
  182. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/automatic.py +0 -0
  183. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/config.py +0 -0
  184. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/default-rubric.json +0 -0
  185. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/options.py +0 -0
  186. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/outcome.py +0 -0
  187. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/persistence.py +0 -0
  188. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/preflight.py +0 -0
  189. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/prompts.py +0 -0
  190. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/resume.py +0 -0
  191. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/runner.py +0 -0
  192. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/scoring.py +0 -0
  193. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/review/wrapper.py +0 -0
  194. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/README.md +0 -0
  195. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/__init__.py +0 -0
  196. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/builtins.py +0 -0
  197. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/events.py +0 -0
  198. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/file_readers.py +0 -0
  199. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/llm.py +0 -0
  200. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/memory_scorer.py +0 -0
  201. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/node.py +0 -0
  202. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/protocol.py +0 -0
  203. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/rubric.py +0 -0
  204. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/rubric_config.py +0 -0
  205. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rewards/validation.py +0 -0
  206. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_config.py +0 -0
  207. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_deadline.py +0 -0
  208. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_results.py +0 -0
  209. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_setup.py +0 -0
  210. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_skills.py +0 -0
  211. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_usage.py +0 -0
  212. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/_user_loop.py +0 -0
  213. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/session_factory_runtime.py +0 -0
  214. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout/task_runtime.py +0 -0
  215. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout_branch.py +0 -0
  216. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/rollout_planes.py +0 -0
  217. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/runtime.py +0 -0
  218. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/__init__.py +0 -0
  219. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_base.py +0 -0
  220. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
  221. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose.py +0 -0
  222. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
  223. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
  224. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose_files/docker-compose-net-admin.yaml +0 -0
  225. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
  226. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
  227. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_egress_denylist_proxy.py +0 -0
  228. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/_sdk_ops.py +0 -0
  229. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore_builder.py +0 -0
  230. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore_image.py +0 -0
  231. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
  232. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
  233. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
  234. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/apple_container.py +0 -0
  235. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/daytona.py +0 -0
  236. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/daytona_dind.py +0 -0
  237. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/daytona_pty.py +0 -0
  238. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/daytona_reaper.py +0 -0
  239. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/daytona_strategies.py +0 -0
  240. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/docker.py +0 -0
  241. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/egress_denylist.py +0 -0
  242. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/lockdown.py +0 -0
  243. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/metadata.py +0 -0
  244. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/modal_impl.py +0 -0
  245. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/__init__.py +0 -0
  246. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/_base.py +0 -0
  247. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/agentcore.py +0 -0
  248. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/apple.py +0 -0
  249. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/daytona.py +0 -0
  250. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/process/docker.py +0 -0
  251. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/providers.py +0 -0
  252. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/services.py +0 -0
  253. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/setup.py +0 -0
  254. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/snapshot.py +0 -0
  255. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sandbox/user.py +0 -0
  256. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/scenes.py +0 -0
  257. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/sdk.py +0 -0
  258. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/self_gen.py +0 -0
  259. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skill_eval/__init__.py +0 -0
  260. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skill_eval/_core.py +0 -0
  261. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skill_eval/gepa_export.py +0 -0
  262. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skill_eval/schema.py +0 -0
  263. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skill_policy.py +0 -0
  264. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/skills.py +0 -0
  265. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/__init__.py +0 -0
  266. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/_document_evidence.py +0 -0
  267. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/_document_normalize.py +0 -0
  268. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/_document_parse.py +0 -0
  269. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/_document_profiles.py +0 -0
  270. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/acceptance_live.py +0 -0
  271. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/acceptance_live_model.py +0 -0
  272. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/acceptance_live_report.py +0 -0
  273. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/acceptance_live_validation.py +0 -0
  274. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/config.py +0 -0
  275. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/discovery.py +0 -0
  276. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/document.py +0 -0
  277. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/env.py +0 -0
  278. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/export.py +0 -0
  279. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/imports.py +0 -0
  280. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/output_format.py +0 -0
  281. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/package.py +0 -0
  282. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/paths.py +0 -0
  283. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/prompts.py +0 -0
  284. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/runtime_capabilities.py +0 -0
  285. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/runtime_view.py +0 -0
  286. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/task.py +0 -0
  287. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier.py +0 -0
  288. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_core.py +0 -0
  289. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_document.py +0 -0
  290. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_errors.py +0 -0
  291. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_judge_inputs.py +0 -0
  292. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_ors_episode.py +0 -0
  293. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_reward_kit.py +0 -0
  294. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_scan.py +0 -0
  295. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/task/verifier_script_strategy.py +0 -0
  296. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/templates/__init__.py +0 -0
  297. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/templates/judge.py.tmpl +0 -0
  298. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/templates/test.sh.tmpl +0 -0
  299. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/__init__.py +0 -0
  300. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/huggingface.py +0 -0
  301. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/local.py +0 -0
  302. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/models.py +0 -0
  303. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/parsers.py +0 -0
  304. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/traces/task_gen.py +0 -0
  305. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/training/__init__.py +0 -0
  306. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/training/backends/__init__.py +0 -0
  307. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/training/backends/prime_rl.py +0 -0
  308. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/training/run_manifest.py +0 -0
  309. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/__init__.py +0 -0
  310. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/_capture.py +0 -0
  311. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/_export_common.py +0 -0
  312. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/_llm_capture.py +0 -0
  313. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/_snapshot.py +0 -0
  314. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/call_purpose.py +0 -0
  315. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/export.py +0 -0
  316. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/export_adp.py +0 -0
  317. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/export_atif.py +0 -0
  318. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/export_prime_sft.py +0 -0
  319. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/export_trl_sft.py +0 -0
  320. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/metrics.py +0 -0
  321. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/results.py +0 -0
  322. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/sessions.py +0 -0
  323. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/tree.py +0 -0
  324. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
  325. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/types.py +0 -0
  326. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/__init__.py +0 -0
  327. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/__main__.py +0 -0
  328. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/boot.js +0 -0
  329. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/catalog.js +0 -0
  330. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/detail.js +0 -0
  331. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/fonts/OFL-google-sans-code.txt +0 -0
  332. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/fonts/google-sans-code-400-latin.woff2 +0 -0
  333. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/fonts/google-sans-code-600-latin.woff2 +0 -0
  334. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/template.html +0 -0
  335. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/theme.css +0 -0
  336. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/theme.js +0 -0
  337. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/vendor/LICENSE.highlight.js +0 -0
  338. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/vendor/highlight.min.js +0 -0
  339. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/viewer.css +0 -0
  340. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/assets/viewer.js +0 -0
  341. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/catalog.py +0 -0
  342. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/legacy.py +0 -0
  343. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/models.py +0 -0
  344. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/payload.py +0 -0
  345. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/render.py +0 -0
  346. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/server.py +0 -0
  347. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/trajectories/viewer/sources.py +0 -0
  348. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/src/benchflow/usage_tracking.py +0 -0
  349. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/__init__.py +0 -0
  350. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/acceptance_live_harness.py +0 -0
  351. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/__init__.py +0 -0
  352. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_codex_config.py +0 -0
  353. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_manifest_dirscan.py +0 -0
  354. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_manifest_loader.py +0 -0
  355. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_manifest_parity.py +0 -0
  356. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_manifest_wiring.py +0 -0
  357. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_namespace_shorthand.py +0 -0
  358. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_plugin_entry_points.py +0 -0
  359. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_protocol.py +0 -0
  360. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/agents/test_remote_manifest_autoload.py +0 -0
  361. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/README.md +0 -0
  362. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
  363. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
  364. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
  365. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/instruction.md +0 -0
  366. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
  367. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/task.md +0 -0
  368. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/task.toml +0 -0
  369. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/acp_smoke/tests/test.sh +0 -0
  370. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/conformance-results.json +0 -0
  371. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/proof_multi_agent.py +0 -0
  372. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/proof_snapshot.py +0 -0
  373. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/run_conformance.py +0 -0
  374. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
  375. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/conftest.py +0 -0
  376. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/__init__.py +0 -0
  377. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/_helpers.py +0 -0
  378. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/test_batch.py +0 -0
  379. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/test_orchestrator.py +0 -0
  380. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/test_replay_proxy.py +0 -0
  381. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/continue_run/test_run_folder.py +0 -0
  382. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/__init__.py +0 -0
  383. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_chibench_manifest.py +0 -0
  384. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_clawsbench_manifest.py +0 -0
  385. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_manifest.py +0 -0
  386. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_manifest_env.py +0 -0
  387. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_protocol.py +0 -0
  388. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/environment/test_readiness.py +0 -0
  389. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
  390. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/instruction.md +0 -0
  391. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/solution/solve.sh +0 -0
  392. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/task.md +0 -0
  393. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/task.toml +0 -0
  394. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/hello-world-task/tests/test.sh +0 -0
  395. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/test_claude.sh +0 -0
  396. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/test_codex.sh +0 -0
  397. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/test_codex_custom_provider.sh +0 -0
  398. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/test_gemini.sh +0 -0
  399. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/test_openclaw.sh +0 -0
  400. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/traces/minimal-claude.jsonl +0 -0
  401. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
  402. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/README.md +0 -0
  403. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
  404. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
  405. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/alpha-task/task.toml +0 -0
  406. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
  407. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
  408. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
  409. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/beta-task/instruction.md +0 -0
  410. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/beta-task/task.toml +0 -0
  411. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
  412. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/mock_acp_agent.py +0 -0
  413. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
  414. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
  415. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/mock_openai_responses_server.py +0 -0
  416. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
  417. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
  418. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
  419. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
  420. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
  421. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
  422. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
  423. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
  424. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
  425. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
  426. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
  427. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
  428. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
  429. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
  430. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
  431. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
  432. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
  433. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
  434. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
  435. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
  436. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
  437. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
  438. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
  439. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
  440. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
  441. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
  442. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
  443. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
  444. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
  445. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
  446. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
  447. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
  448. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
  449. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
  450. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
  451. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
  452. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
  453. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
  454. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
  455. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
  456. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
  457. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
  458. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
  459. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
  460. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
  461. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
  462. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
  463. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
  464. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
  465. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
  466. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
  467. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
  468. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
  469. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
  470. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
  471. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
  472. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
  473. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
  474. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
  475. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
  476. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/_consistency.py +0 -0
  477. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/agent_judge.py +0 -0
  478. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/check_adapter_evidence.py +0 -0
  479. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/check_hosted_env_evidence.py +0 -0
  480. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/check_results.py +0 -0
  481. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
  482. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/check_trace_to_task_evidence.py +0 -0
  483. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/claude-agent-acp.yaml +0 -0
  484. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/codex-acp.yaml +0 -0
  485. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/gemini.yaml +0 -0
  486. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
  487. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/mimo.yaml +0 -0
  488. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/openclaw.yaml +0 -0
  489. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/opencode.yaml +0 -0
  490. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/openhands.yaml +0 -0
  491. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/configs/pi-acp.yaml +0 -0
  492. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/deepagents_harness.py +0 -0
  493. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/rubric_checks.py +0 -0
  494. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/run.sh +0 -0
  495. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/run_suite.py +0 -0
  496. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/scenarios.py +0 -0
  497. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/integration/suites/release.yaml +0 -0
  498. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acceptance_evidence.py +0 -0
  499. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acceptance_live.py +0 -0
  500. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acceptance_live_execution.py +0 -0
  501. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp.py +0 -0
  502. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_buffered_timeout.py +0 -0
  503. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_capability_advertising.py +0 -0
  504. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_mcp_servers.py +0 -0
  505. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_model_config_dispatch.py +0 -0
  506. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_pinned_protocol_guard.py +0 -0
  507. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_setup_failure_propagation.py +0 -0
  508. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_acp_timeout_evidence.py +0 -0
  509. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_adapter_scripts.py +0 -0
  510. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_adapters.py +0 -0
  511. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_cli.py +0 -0
  512. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_egress_firewall.py +0 -0
  513. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_env_resolution.py +0 -0
  514. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_gemini_defaults.py +0 -0
  515. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_idle_timeout_cli.py +0 -0
  516. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_model_decouple.py +0 -0
  517. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_registry.py +0 -0
  518. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_router.py +0 -0
  519. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_router_cli_e2e.py +0 -0
  520. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_router_scaffold.py +0 -0
  521. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_setup.py +0 -0
  522. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agent_spec.py +0 -0
  523. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agentcore_builder.py +0 -0
  524. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agentcore_reaper.py +0 -0
  525. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_agentcore_transport.py +0 -0
  526. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_api_error_capture.py +0 -0
  527. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_apple_container_sandbox.py +0 -0
  528. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_automatic_review_scoring.py +0 -0
  529. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_bare_model_provider.py +0 -0
  530. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_base_install_imports.py +0 -0
  531. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_bedrock_thinking.py +0 -0
  532. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_benchflow_experiment_review_validator.py +0 -0
  533. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
  534. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_branch.py +0 -0
  535. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_build_context_stage.py +0 -0
  536. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_build_review_pack.py +0 -0
  537. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_capture_trajectory.py +0 -0
  538. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_check_skillsbench_harbor_parity.py +0 -0
  539. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_clawsbench_slice.py +0 -0
  540. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_adopt_aliases.py +0 -0
  541. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_arg_validation.py +0 -0
  542. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_daytona.py +0 -0
  543. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_docs_drift.py +0 -0
  544. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_edge_case_hardening.py +0 -0
  545. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_hub_env.py +0 -0
  546. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_live_progress.py +0 -0
  547. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_cli_misc.py +0 -0
  548. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_codex_review.py +0 -0
  549. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_codex_self_write_auth.py +0 -0
  550. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_config_override.py +0 -0
  551. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_config_redaction.py +0 -0
  552. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_connect_as_env.py +0 -0
  553. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_console_error_truncation.py +0 -0
  554. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_console_progress.py +0 -0
  555. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_continuallearningbench_adapter.py +0 -0
  556. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_dataset_registry.py +0 -0
  557. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_command_polling.py +0 -0
  558. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_dind_compose_up.py +0 -0
  559. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_download.py +0 -0
  560. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_litellm_runtime.py +0 -0
  561. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_poll_deadline.py +0 -0
  562. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_daytona_reap.py +0 -0
  563. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_deepagents_agent.py +0 -0
  564. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_diagnostics.py +0 -0
  565. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_docker_prune_scoping.py +0 -0
  566. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_docker_uploads.py +0 -0
  567. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_docs_examples.py +0 -0
  568. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_egress_connect_authority.py +0 -0
  569. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_egress_denylist.py +0 -0
  570. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_egress_denylist_integration.py +0 -0
  571. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_egress_dynamic_certs.py +0 -0
  572. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_egress_model_gateway.py +0 -0
  573. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eng50_capabilities.py +0 -0
  574. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_env_registry.py +0 -0
  575. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_env_setup.py +0 -0
  576. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_environment_manifest_controls.py +0 -0
  577. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_artifact_cli.py +0 -0
  578. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_filters_applied.py +0 -0
  579. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_lift.py +0 -0
  580. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_sharding.py +0 -0
  581. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_single_task_summary.py +0 -0
  582. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_source_provenance.py +0 -0
  583. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_worker_retry.py +0 -0
  584. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_eval_zero_task_guard.py +0 -0
  585. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_evaluation_environment_manifest.py +0 -0
  586. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_exclude_tasks.py +0 -0
  587. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_filter_credentialed_cells.py +0 -0
  588. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_harvey_lab_shim.py +0 -0
  589. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_hilbench_adapter.py +0 -0
  590. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_hosted_env.py +0 -0
  591. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_hosted_env_rollout_contract.py +0 -0
  592. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_hosted_search_policy.py +0 -0
  593. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_hub_harbor_registry.py +0 -0
  594. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_inbound_adapter_manifest.py +0 -0
  595. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_inbound_adapters.py +0 -0
  596. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_agent_judge.py +0 -0
  597. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_check_results.py +0 -0
  598. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_consistency.py +0 -0
  599. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_matrix.py +0 -0
  600. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_provider_selection.py +0 -0
  601. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_run_suite.py +0 -0
  602. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_integration_suite.py +0 -0
  603. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_internet_policy.py +0 -0
  604. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_job.py +0 -0
  605. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_job_sequential_shared.py +0 -0
  606. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_job_sequential_shared_resume.py +0 -0
  607. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_judge_robustness.py +0 -0
  608. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_judge_symlink_ingestion.py +0 -0
  609. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_learner_skills.py +0 -0
  610. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_learner_skills_traversal.py +0 -0
  611. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_learner_store.py +0 -0
  612. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_learner_store_persistence.py +0 -0
  613. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_config.py +0 -0
  614. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_gemini_passthrough_patch.py +0 -0
  615. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_hardening.py +0 -0
  616. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_logging.py +0 -0
  617. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_model_via_env_generic.py +0 -0
  618. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_reasoning_passthrough.py +0 -0
  619. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_runtime.py +0 -0
  620. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_litellm_smoke.py +0 -0
  621. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_live_llm_trajectory.py +0 -0
  622. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_llm_judge.py +0 -0
  623. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_llm_judge_event_tags.py +0 -0
  624. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_llm_judge_verifier.py +0 -0
  625. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_loop_strategies.py +0 -0
  626. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_loop_summary.py +0 -0
  627. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_loop_sweep.py +0 -0
  628. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_memory_scorer.py +0 -0
  629. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_metrics.py +0 -0
  630. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_mle_bench_adapter.py +0 -0
  631. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_mock_openai_responses_server.py +0 -0
  632. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_monitor_scaffold.py +0 -0
  633. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_native_acp_usage.py +0 -0
  634. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_network_denylist_config.py +0 -0
  635. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_no_cross_provider_fallback.py +0 -0
  636. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_notification_order_real.py +0 -0
  637. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_opencode_family_proxy_tracking.py +0 -0
  638. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_oracle.py +0 -0
  639. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_oracle_chokepoint.py +0 -0
  640. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_paths_safe.py +0 -0
  641. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_paths_symlink_helpers.py +0 -0
  642. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_pi_acp_launcher.py +0 -0
  643. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_pi_acp_proxy_routing.py +0 -0
  644. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_process.py +0 -0
  645. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_project_skills_layout.py +0 -0
  646. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_provider_auth_detection.py +0 -0
  647. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_providers.py +0 -0
  648. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_publish_azure_blob.py +0 -0
  649. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_publish_huggingface.py +0 -0
  650. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_redacted_snapshot.py +0 -0
  651. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reexport.py +0 -0
  652. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_registry_invariants.py +0 -0
  653. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_release_hardening_r5.py +0 -0
  654. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_release_version.py +0 -0
  655. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_release_workflow_wiring.py +0 -0
  656. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_resolve_env_helpers.py +0 -0
  657. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_boundaries.py +0 -0
  658. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_lifecycle.py +0 -0
  659. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_resume.py +0 -0
  660. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_rubric.py +0 -0
  661. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_runtime.py +0 -0
  662. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_runtime_automatic.py +0 -0
  663. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_review_snapshot.py +0 -0
  664. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reviewer_options.py +0 -0
  665. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reward_lenient.py +0 -0
  666. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reward_node.py +0 -0
  667. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reward_range.py +0 -0
  668. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_reward_unified_contract.py +0 -0
  669. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rewards.py +0 -0
  670. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rewards_jsonl.py +0 -0
  671. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_architecture.py +0 -0
  672. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_branch.py +0 -0
  673. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_config_path_coercion.py +0 -0
  674. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_environment.py +0 -0
  675. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_hard_deadline.py +0 -0
  676. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_import_no_side_effects.py +0 -0
  677. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_on_ask_user_wiring.py +0 -0
  678. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_planes_contract.py +0 -0
  679. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_probe_sandbox_health.py +0 -0
  680. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_session_factory_dispatch.py +0 -0
  681. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_setup_commands.py +0 -0
  682. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rollout_upload.py +0 -0
  683. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rubric_checks.py +0 -0
  684. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_rubric_config.py +0 -0
  685. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_runtime.py +0 -0
  686. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_runtime_capabilities.py +0 -0
  687. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_runtime_config_wired.py +0 -0
  688. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_runtime_live_sandbox.py +0 -0
  689. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox.py +0 -0
  690. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_exec_secret_handling.py +0 -0
  691. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_hardening.py +0 -0
  692. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
  693. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_live_process.py +0 -0
  694. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_multi_service.py +0 -0
  695. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_prebuilt_validation.py +0 -0
  696. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_protocol.py +0 -0
  697. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_provider_registry_drift.py +0 -0
  698. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_setup.py +0 -0
  699. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_snapshot_contract.py +0 -0
  700. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_upload_symlink.py +0 -0
  701. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sandbox_verifier_workspace.py +0 -0
  702. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_scene.py +0 -0
  703. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_scene_outbox_trial.py +0 -0
  704. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_scene_parallel_group.py +0 -0
  705. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_scene_result_aggregation.py +0 -0
  706. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_scoring.py +0 -0
  707. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sdk_internals.py +0 -0
  708. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sdk_lockdown.py +0 -0
  709. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sdk_run_alias.py +0 -0
  710. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_sealed_channel_container.py +0 -0
  711. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_self_gen_cli.py +0 -0
  712. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_self_gen_export_error_channel.py +0 -0
  713. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_self_gen_export_failures.py +0 -0
  714. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_self_gen_orchestration.py +0 -0
  715. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_session_factory_runtime.py +0 -0
  716. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_session_request_permission_dispatch.py +0 -0
  717. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_eval.py +0 -0
  718. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_eval_dryrun.py +0 -0
  719. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_eval_integration.py +0 -0
  720. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_eval_sweep.py +0 -0
  721. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_eval_traversal.py +0 -0
  722. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_invocation_artifacts.py +0 -0
  723. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skill_policy.py +0 -0
  724. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skills.py +0 -0
  725. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skills_dir_agent_home_link.py +0 -0
  726. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skillsbench_conversion_conformance.py +0 -0
  727. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_skillsbench_harbor_run_suite.py +0 -0
  728. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_smoke.py +0 -0
  729. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_smoke_wiring.py +0 -0
  730. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_source_adapters.py +0 -0
  731. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_subscription_auth.py +0 -0
  732. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_check_eval_consistency.py +0 -0
  733. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_config.py +0 -0
  734. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_digest.py +0 -0
  735. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_document.py +0 -0
  736. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_download.py +0 -0
  737. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_export.py +0 -0
  738. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_output_format.py +0 -0
  739. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_package.py +0 -0
  740. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_task_runtime_primitive.py +0 -0
  741. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_tasks.py +0 -0
  742. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_token_usage_normalization.py +0 -0
  743. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_tool_call_raw_io.py +0 -0
  744. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trace_import_cli.py +0 -0
  745. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trace_task_gen_traversal.py +0 -0
  746. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trace_to_task_evidence.py +0 -0
  747. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traces_huggingface.py +0 -0
  748. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traces_parsers.py +0 -0
  749. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traces_task_gen.py +0 -0
  750. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_train_cli.py +0 -0
  751. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_train_mode_artifact_emission.py +0 -0
  752. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_train_trl_cli.py +0 -0
  753. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_report.py +0 -0
  754. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_staging_phases.py +0 -0
  755. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_tui.py +0 -0
  756. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_upload_cli.py +0 -0
  757. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_upload_skill.py +0 -0
  758. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_traj_workspace.py +0 -0
  759. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trajectory_integration.py +0 -0
  760. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trajectory_streaming.py +0 -0
  761. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trajectory_upload_layout.py +0 -0
  762. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trajectory_upload_service.py +0 -0
  763. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trial_agent_timeout_verify.py +0 -0
  764. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trial_install_agent_timeout.py +0 -0
  765. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trial_litellm_runtime.py +0 -0
  766. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_trl_integration.py +0 -0
  767. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_usage_litellm.py +0 -0
  768. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_usage_required.py +0 -0
  769. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_usage_tracking.py +0 -0
  770. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_user.py +0 -0
  771. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_v06_guard_ports.py +0 -0
  772. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_document.py +0 -0
  773. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_multi_container.py +0 -0
  774. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_output.py +0 -0
  775. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_output_freshness.py +0 -0
  776. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_strategies.py +0 -0
  777. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verifier_wedge_retry.py +0 -0
  778. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_verify.py +0 -0
  779. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_viewer_confirm.py +0 -0
  780. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_workflow_action_pinning.py +0 -0
  781. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/test_yaml_config.py +0 -0
  782. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/__init__.py +0 -0
  783. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export.py +0 -0
  784. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export_adp.py +0 -0
  785. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export_atif.py +0 -0
  786. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export_common.py +0 -0
  787. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export_nan_handling.py +0 -0
  788. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_export_prime_sft.py +0 -0
  789. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_redaction.py +0 -0
  790. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_step_granularity.py +0 -0
  791. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_tree.py +0 -0
  792. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_viewer_acp_renderer.py +0 -0
  793. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_viewer_browser.py +0 -0
  794. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_viewer_rubric.py +0 -0
  795. {benchflow-0.7.8.dev2342 → benchflow-0.7.9.dev2354}/tests/trajectories/test_viewer_theme.py +0 -0
@@ -2,6 +2,44 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## 0.7.8 — 2026-09-14
6
+
7
+ ### Added
8
+
9
+ - **Automatic rubric review and scoring.** Tasks with a weighted `rubric.json`
10
+ run a separate reviewer after verification. Passing requires all required
11
+ tests and rubric blockers to pass; the final reward is the weighted quality
12
+ score. Solver evidence and reviewer runs are retained, and `bench eval score`
13
+ can retry an interrupted review without rerunning the solver. (#1126)
14
+ - **Rubric results in the trajectory viewer.** The Rubric tab displays criterion
15
+ judgments, explanations, blocker outcomes, and weighted scores. (#1102)
16
+ - **Viewer themes and syntax highlighting.** Trajectory pages support a dark
17
+ theme and highlighted tool content. (#1098)
18
+
19
+ ### Fixed
20
+
21
+ - **Automatic rubric review works on Daytona when the task workspace is
22
+ `/root`.** Daytona's daemon keeps its session tree in `/root/.daytona` (the
23
+ entrypoint's FIFOs plus every session command's script, log and exit code),
24
+ and evidence capture aborted on the first FIFO, so the rollout ended in a
25
+ scoring error with `rewards: null` although its verifier had run. Capture now
26
+ leaves that tree out as `sandbox_runtime` and records any other socket, FIFO
27
+ or device node as a `special_file` exclusion instead of aborting. Capture
28
+ limits, escaping symlinks and concurrent changes still fail closed. (#1128)
29
+ - **Automatic review supports shell-only task images.** Required Python
30
+ capture tools are provisioned before the solver starts, so a successful
31
+ shell task does not lose its review to a missing interpreter. (#1127)
32
+ - **Denylist enforcement closes CONNECT and HTTP Host bypasses.** TLS identity
33
+ and HTTP authority are checked against the allowed destination on Docker and
34
+ Daytona. (#1122)
35
+ - **IPv6 egress rules are installed when procfs reports zero-size files.**
36
+ Sandbox firewall setup reads the kernel data instead of relying on the
37
+ reported file size. (#1124)
38
+ - **Buffered ACP prompts respect their deadlines.** Timeout handling no longer
39
+ repeats captured provider history. (#1125)
40
+ - **Tool captures retain their content and raw input/output.** ACP trajectories
41
+ preserve observations needed for later review. (#1100)
42
+
5
43
  ## 0.7.7 — 2026-09-09
6
44
 
7
45
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: benchflow
3
- Version: 0.7.8.dev2342
3
+ Version: 0.7.9.dev2354
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.8.dev2342"
3
+ version = "0.7.9.dev2354"
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"
@@ -25,7 +25,7 @@ from typing import Literal, Self
25
25
  from pydantic import BaseModel, ConfigDict, Field, model_validator
26
26
 
27
27
  from benchflow.agents.credentials import CREDENTIAL_EVIDENCE_PATHS
28
- from benchflow.sandbox.protocol import Sandbox
28
+ from benchflow.sandbox.protocol import SANDBOX_RUNTIME_STATE_PATHS, Sandbox
29
29
  from benchflow.task.config import ArtifactConfig
30
30
 
31
31
  logger = logging.getLogger(__name__)
@@ -51,7 +51,7 @@ class EvidenceExclusion(BaseModel):
51
51
  model_config = ConfigDict(extra="forbid", frozen=True)
52
52
 
53
53
  original_path: str
54
- reason: Literal["credential", "task_exclude"]
54
+ reason: Literal["credential", "sandbox_runtime", "special_file", "task_exclude"]
55
55
 
56
56
 
57
57
  class ArtifactEvidence(BaseModel):
@@ -94,8 +94,10 @@ class _CaptureReceipt(BaseModel):
94
94
 
95
95
 
96
96
  # Runs in both Docker and Daytona without requiring BenchFlow in the image.
97
- # Enumeration is explicit so sockets, devices, FIFOs and quota overflows fail
98
- # rather than being silently omitted by a tar command.
97
+ # Enumeration is explicit so nothing is silently omitted by a tar command.
98
+ # Sockets, devices and FIFOs hold no bytes to preserve, and provider runtime
99
+ # state is harness-owned, so both are recorded as manifest exclusions; quota
100
+ # overflows, escaping links and concurrent changes still fail the capture.
99
101
  _CAPTURE_SCRIPT = r"""
100
102
  import fnmatch, hashlib, json, os, pathlib, stat, sys, tarfile, tempfile
101
103
  source = pathlib.Path(sys.argv[1]).resolve()
@@ -107,18 +109,26 @@ root = source if source.is_dir() else source.parent
107
109
  max_bytes, max_entries = map(int, sys.argv[2:4])
108
110
  rules = json.loads(sys.argv[4])
109
111
  paths, exclusions, total = [], [], 0
112
+ def record(path, reason):
113
+ exclusions.append({"original_path": path.as_posix(), "reason": reason})
114
+ if len(paths) + len(exclusions) > max_entries:
115
+ raise ValueError("workspace evidence exceeds configured capture limits")
116
+ def component(path, rule):
117
+ return path.endswith("/" + rule) or "/" + rule + "/" in path
110
118
  def excluded(path):
111
119
  absolute = path.as_posix()
112
120
  relative = path.relative_to(root).as_posix()
113
- credential = any(absolute.endswith("/" + rule) or "/" + rule + "/" in absolute for rule in rules["credentials"])
121
+ credential = any(component(absolute, rule) for rule in rules["credentials"])
114
122
  credential |= any(path == pathlib.Path(rule) or path.is_relative_to(rule) for rule in rules["paths"])
115
123
  reason = "credential" if credential else None
124
+ # Relative to the captured root: runtime state below the root is dropped,
125
+ # but a root that itself lies under such a directory is still captured.
126
+ if reason is None and any(component("/" + relative, rule) for rule in rules["sandbox_runtime"]):
127
+ reason = "sandbox_runtime"
116
128
  if reason is None and any(fnmatch.fnmatchcase(relative, rule) or fnmatch.fnmatchcase(path.name, rule) for rule in rules["exclude"]):
117
129
  reason = "task_exclude"
118
130
  if reason:
119
- exclusions.append({"original_path": absolute, "reason": reason})
120
- if len(paths) + len(exclusions) > max_entries:
121
- raise ValueError("workspace evidence exceeds configured capture limits")
131
+ record(path, reason)
122
132
  return True
123
133
  return False
124
134
  def scan_error(error):
@@ -136,7 +146,8 @@ for directory, dirs, files in walk:
136
146
  info = path.lstat()
137
147
  if not any(check(info.st_mode) for check in
138
148
  (stat.S_ISREG, stat.S_ISDIR, stat.S_ISLNK)):
139
- raise ValueError("unsupported workspace entry: " + str(path))
149
+ record(path, "special_file")
150
+ continue
140
151
  if path.is_symlink() and not path.resolve().is_relative_to(root):
141
152
  raise ValueError("workspace symlink escapes evidence: " + str(path))
142
153
  total += info.st_size if stat.S_ISREG(info.st_mode) else 0
@@ -334,7 +345,10 @@ async def capture_workspace(
334
345
 
335
346
  ``destination`` must not exist. It receives ``workspace/`` and
336
347
  ``manifest.json`` together after successful validation. Capture limits are
337
- hard errors: this API never labels a truncated tree complete.
348
+ hard errors: this API never labels a truncated tree complete. Credential
349
+ files, provider runtime state (``SANDBOX_RUNTIME_STATE_PATHS``) and
350
+ sockets, FIFOs or device nodes stay out of the bundle, each recorded in
351
+ ``manifest.exclusions``.
338
352
  """
339
353
  if destination.exists() or destination.is_symlink():
340
354
  raise EvidenceError(f"Evidence destination already exists: {destination}")
@@ -346,6 +360,7 @@ async def capture_workspace(
346
360
  rules = json.dumps(
347
361
  {
348
362
  "credentials": CREDENTIAL_EVIDENCE_PATHS,
363
+ "sandbox_runtime": SANDBOX_RUNTIME_STATE_PATHS,
349
364
  "exclude": list(exclude),
350
365
  "paths": list(excluded_paths),
351
366
  }
@@ -0,0 +1,49 @@
1
+ """Provision the stdlib runtime used for trusted workspace capture."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import shlex
6
+
7
+ from benchflow.review.evidence import EvidenceError
8
+ from benchflow.sandbox.protocol import Sandbox
9
+
10
+ _PYTHON_PROBE = "import sys; raise SystemExit(sys.version_info < (3, 10))"
11
+ _SETUP_SCRIPT = f"""
12
+ set -eu
13
+ if python3 -I -c {shlex.quote(_PYTHON_PROBE)} >/dev/null 2>&1; then
14
+ exit 0
15
+ fi
16
+ if command -v apt-get >/dev/null 2>&1; then
17
+ apt-get update -qq
18
+ DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends python3
19
+ elif command -v apk >/dev/null 2>&1; then
20
+ apk add --no-cache python3
21
+ elif command -v dnf >/dev/null 2>&1; then
22
+ dnf install -y python3
23
+ elif command -v microdnf >/dev/null 2>&1; then
24
+ microdnf install -y python3
25
+ elif command -v yum >/dev/null 2>&1; then
26
+ yum install -y python3
27
+ else
28
+ echo 'Automatic review requires Python 3.10+ in the task image; no supported package manager is available.' >&2
29
+ exit 1
30
+ fi
31
+ python3 -I -c {shlex.quote(_PYTHON_PROBE)}
32
+ """
33
+
34
+
35
+ async def ensure_evidence_python(env: Sandbox, *, timeout_sec: int = 600) -> None:
36
+ """Prepare capture before the solver runs, including shell-only images.
37
+
38
+ Existing compatible interpreters require no package installation. Failure
39
+ is a setup error, before a solver can spend its budget producing evidence
40
+ that the controller cannot preserve.
41
+ """
42
+ result = await env.exec(
43
+ shlex.join(["sh", "-c", _SETUP_SCRIPT]),
44
+ user="root",
45
+ timeout_sec=timeout_sec,
46
+ )
47
+ if result.return_code != 0:
48
+ details = (result.stderr or result.stdout or "")[-2000:]
49
+ raise EvidenceError(f"Could not prepare workspace capture Python: {details}")
@@ -1189,6 +1189,10 @@ class Rollout:
1189
1189
 
1190
1190
  self._agent_cwd = await _resolve_agent_cwd(self._env, self._task)
1191
1191
 
1192
+ from benchflow.rollout._review import prepare_capture_runtime
1193
+
1194
+ await prepare_capture_runtime(self)
1195
+
1192
1196
  if cfg.primary_agent == "oracle":
1193
1197
  if cfg.sandbox_user:
1194
1198
  await self._planes.setup_sandbox_user(
@@ -10,6 +10,7 @@ from benchflow._utils.text import describe_exception
10
10
  from benchflow.agents.credentials import credential_evidence_overrides
11
11
  from benchflow.review.automatic import finish_review, prepare_review
12
12
  from benchflow.review.evidence import capture_task_evidence
13
+ from benchflow.review.evidence_runtime import ensure_evidence_python
13
14
  from benchflow.review.outcome import scoring_error
14
15
  from benchflow.review.persistence import commit_scoring_result, scoring_lock
15
16
 
@@ -35,6 +36,14 @@ def prepare_terminal_review(rollout: Rollout) -> None:
35
36
  cfg.task_digest = digest
36
37
 
37
38
 
39
+ async def prepare_capture_runtime(rollout: Rollout) -> None:
40
+ """Ensure required capture dependencies exist before solver execution."""
41
+ if rollout._review_plan is not None or rollout._config.purpose == "reviewer":
42
+ await ensure_evidence_python(
43
+ rollout._env, timeout_sec=rollout._config.sandbox_setup_timeout
44
+ )
45
+
46
+
38
47
  async def capture_terminal_workspace(rollout: Rollout) -> None:
39
48
  """Freeze solver or reviewer files before verifier hardening mutates them."""
40
49
  if rollout._review_plan is None and rollout._config.purpose != "reviewer":
@@ -50,6 +50,7 @@ import hashlib
50
50
  import io
51
51
  import json
52
52
  import os
53
+ import re
53
54
  import shlex
54
55
  import tarfile
55
56
  import threading
@@ -92,7 +93,11 @@ _MAX_DOWNLOAD_BYTES = 64 * 1024 * 1024
92
93
  # whatever the service currently defaults to.
93
94
  _PROTOCOL_CONFIGURATION = {"serverProtocol": "HTTP"}
94
95
  #: AgentCore offers PUBLIC or VPC only; see the registry's enforces_no_network.
95
- _NETWORK_CONFIGURATION = {"networkMode": "PUBLIC"}
96
+ _NETWORK_MODES = ("PUBLIC", "VPC")
97
+ #: ``VpcConfig`` caps both lists at 16 and pins the id shapes.
98
+ _MAX_VPC_IDS = 16
99
+ _SUBNET_ID = re.compile(r"^subnet-[0-9a-zA-Z]{8,17}$")
100
+ _SECURITY_GROUP_ID = re.compile(r"^sg-[0-9a-zA-Z]{8,17}$")
96
101
 
97
102
  # Environment overrides.
98
103
  _ENV_REGION = "BENCHFLOW_AGENTCORE_REGION"
@@ -100,6 +105,9 @@ _ENV_ROLE_ARN = "BENCHFLOW_AGENTCORE_ROLE_ARN"
100
105
  _ENV_ECR_REPOSITORY = "BENCHFLOW_AGENTCORE_ECR_REPOSITORY"
101
106
  _ENV_IDLE_TIMEOUT = "BENCHFLOW_AGENTCORE_IDLE_TIMEOUT_SEC"
102
107
  _ENV_MAX_LIFETIME = "BENCHFLOW_AGENTCORE_MAX_LIFETIME_SEC"
108
+ _ENV_NETWORK_MODE = "BENCHFLOW_AGENTCORE_NETWORK_MODE"
109
+ _ENV_SUBNETS = "BENCHFLOW_AGENTCORE_SUBNETS"
110
+ _ENV_SECURITY_GROUPS = "BENCHFLOW_AGENTCORE_SECURITY_GROUPS"
103
111
 
104
112
 
105
113
  class AgentCoreSandbox(BaseSandbox):
@@ -314,7 +322,7 @@ class AgentCoreSandbox(BaseSandbox):
314
322
  contract = {
315
323
  "imageDigest": image_digest,
316
324
  "lifecycleConfiguration": self._lifecycle_configuration(),
317
- "networkConfiguration": _NETWORK_CONFIGURATION,
325
+ "networkConfiguration": self._network_configuration(),
318
326
  "protocolConfiguration": _PROTOCOL_CONFIGURATION,
319
327
  "roleArn": self._require_role_arn(),
320
328
  }
@@ -341,7 +349,7 @@ class AgentCoreSandbox(BaseSandbox):
341
349
  "containerConfiguration": {"containerUri": image_uri}
342
350
  },
343
351
  roleArn=self._require_role_arn(),
344
- networkConfiguration=_NETWORK_CONFIGURATION,
352
+ networkConfiguration=self._network_configuration(),
345
353
  protocolConfiguration=_PROTOCOL_CONFIGURATION,
346
354
  lifecycleConfiguration=self._lifecycle_configuration(),
347
355
  description=f"BenchFlow sandbox for {self.environment_name}",
@@ -381,7 +389,7 @@ class AgentCoreSandbox(BaseSandbox):
381
389
  "containerConfiguration": {"containerUri": image_uri}
382
390
  },
383
391
  roleArn=self._require_role_arn(),
384
- networkConfiguration=_NETWORK_CONFIGURATION,
392
+ networkConfiguration=self._network_configuration(),
385
393
  protocolConfiguration=_PROTOCOL_CONFIGURATION,
386
394
  # Omitting this resets idle/max-lifetime to the service
387
395
  # defaults, silently discarding the caller's configured
@@ -396,7 +404,7 @@ class AgentCoreSandbox(BaseSandbox):
396
404
  image_uri,
397
405
  self._lifecycle_configuration(),
398
406
  self._require_role_arn(),
399
- _NETWORK_CONFIGURATION,
407
+ self._network_configuration(),
400
408
  _PROTOCOL_CONFIGURATION,
401
409
  )
402
410
  self.logger.info("Adopted existing AgentCore runtime %s", arn)
@@ -510,11 +518,6 @@ class AgentCoreSandbox(BaseSandbox):
510
518
  # for — wrong permissions, wrong egress, or a shell that never answers.
511
519
  for label, expected, found in (
512
520
  ("roleArn", role_arn, detail.get("roleArn")),
513
- (
514
- "networkConfiguration",
515
- dict(network),
516
- dict(detail.get("networkConfiguration") or {}),
517
- ),
518
521
  (
519
522
  "protocolConfiguration",
520
523
  dict(protocol),
@@ -523,6 +526,25 @@ class AgentCoreSandbox(BaseSandbox):
523
526
  ):
524
527
  if found != expected:
525
528
  drifted[label] = (found, expected)
529
+
530
+ def _placement(config: dict[str, Any]) -> tuple[Any, ...]:
531
+ """Only the placement BenchFlow itself pins.
532
+
533
+ ``VpcConfig`` also carries service-managed members that cannot be
534
+ sent on create, and nothing promises the ids come back in the order
535
+ they were given — comparing the whole document would refuse every
536
+ adoption of a healthy VPC runtime.
537
+ """
538
+ vpc = config.get("networkModeConfig") or {}
539
+ return (
540
+ config.get("networkMode"),
541
+ tuple(sorted(vpc.get("subnets") or ())),
542
+ tuple(sorted(vpc.get("securityGroups") or ())),
543
+ )
544
+
545
+ found_network = dict(detail.get("networkConfiguration") or {})
546
+ if _placement(found_network) != _placement(dict(network)):
547
+ drifted["networkConfiguration"] = (found_network, dict(network))
526
548
  if drifted:
527
549
  raise SandboxStartupError(
528
550
  f"AgentCore runtime {runtime_id} does not match this run's "
@@ -564,6 +586,72 @@ class AgentCoreSandbox(BaseSandbox):
564
586
  "maxLifetime": lifetime,
565
587
  }
566
588
 
589
+ def _network_configuration(self) -> dict[str, Any]:
590
+ """Where the runtime's microVMs are placed on the network.
591
+
592
+ ``PUBLIC`` stays the default so existing deployments do not move, but
593
+ the ``VPC`` opt-in fails loudly rather than quietly: a half-configured
594
+ runtime that silently stays public is exactly the exposure the operator
595
+ set out to remove, and it is invisible once the runtime is READY.
596
+ """
597
+
598
+ def _ids(name: str, pattern: re.Pattern[str], shape: str) -> list[str]:
599
+ raw = os.environ.get(name) or ""
600
+ # Canonical order and no duplicates: this list feeds the runtime
601
+ # contract digest, so "a,b" and "b,a" must not register two
602
+ # runtimes for the same infrastructure.
603
+ values: list[str] = sorted(
604
+ {item.strip() for item in raw.split(",") if item.strip()}
605
+ )
606
+ for item in values:
607
+ if not pattern.match(item):
608
+ raise ValueError(
609
+ f"{name} must be a comma-separated list of {shape} ids, "
610
+ f"got {item!r}."
611
+ )
612
+ if len(values) > _MAX_VPC_IDS:
613
+ raise ValueError(
614
+ f"{name} accepts at most {_MAX_VPC_IDS} ids, got {len(values)}."
615
+ )
616
+ return values
617
+
618
+ subnets = _ids(_ENV_SUBNETS, _SUBNET_ID, "subnet-*")
619
+ security_groups = _ids(_ENV_SECURITY_GROUPS, _SECURITY_GROUP_ID, "sg-*")
620
+ mode = (os.environ.get(_ENV_NETWORK_MODE) or "PUBLIC").strip().upper()
621
+ if mode not in _NETWORK_MODES:
622
+ raise ValueError(
623
+ f"{_ENV_NETWORK_MODE} must be one of {', '.join(_NETWORK_MODES)}, "
624
+ f"got {mode!r}."
625
+ )
626
+ if mode == "PUBLIC":
627
+ if subnets or security_groups:
628
+ raise ValueError(
629
+ f"{_ENV_SUBNETS}/{_ENV_SECURITY_GROUPS} are set but "
630
+ f"{_ENV_NETWORK_MODE} is not VPC, so the runtime would still "
631
+ f"be created on the public internet. Set "
632
+ f"{_ENV_NETWORK_MODE}=VPC to place it in the VPC."
633
+ )
634
+ return {"networkMode": "PUBLIC"}
635
+ missing = [
636
+ name
637
+ for name, values in (
638
+ (_ENV_SUBNETS, subnets),
639
+ (_ENV_SECURITY_GROUPS, security_groups),
640
+ )
641
+ if not values
642
+ ]
643
+ if missing:
644
+ raise ValueError(
645
+ f"{_ENV_NETWORK_MODE}=VPC requires {' and '.join(missing)}."
646
+ )
647
+ return {
648
+ "networkMode": "VPC",
649
+ "networkModeConfig": {
650
+ "subnets": subnets,
651
+ "securityGroups": security_groups,
652
+ },
653
+ }
654
+
567
655
  def configure_agent_timeout(self, timeout_sec: int) -> None:
568
656
  """Keep the remote session alive for the effective rollout budget."""
569
657
  self._agent_timeout_sec = max(0, int(timeout_sec))
@@ -6,6 +6,16 @@ from dataclasses import dataclass, field
6
6
  from pathlib import Path
7
7
  from typing import Protocol, runtime_checkable
8
8
 
9
+ # Directories a provider daemon owns inside the sandbox, matched as path
10
+ # components below a captured root. Daytona keeps ~/.daytona/sessions in the
11
+ # home of the account its daemon runs as (root in task images): the
12
+ # entrypoint's stdin/stdout/stderr FIFOs plus every session command's script,
13
+ # output log and exit code. With a /root workspace that tree sits inside the
14
+ # solver's working directory, changes while any command runs (evidence capture
15
+ # included), and is harness state rather than solver output. Docker keeps exec
16
+ # state outside the container filesystem, so it needs no entry.
17
+ SANDBOX_RUNTIME_STATE_PATHS = (".daytona",)
18
+
9
19
 
10
20
  @dataclass(frozen=True)
11
21
  class ExecResult:
@@ -743,6 +743,161 @@ class TestAdoptionContract:
743
743
  self._verify(self._detail(**{field: value}))
744
744
 
745
745
 
746
+ _VPC_NETWORK = {
747
+ "networkMode": "VPC",
748
+ "networkModeConfig": {
749
+ "subnets": ["subnet-0a1b2c3d4e5f67890"],
750
+ "securityGroups": ["sg-0a1b2c3d4e5f67890"],
751
+ },
752
+ }
753
+
754
+
755
+ class TestNetworkConfigurationReachesTheRuntime:
756
+ """The configured network placement has to survive to the control plane.
757
+
758
+ ``_network_configuration`` deciding VPC is worth nothing if registration
759
+ still sends the old constant, and the mistake is invisible: the runtime
760
+ reaches READY either way, just reachable from the internet.
761
+ """
762
+
763
+ def _vpc_env(self, monkeypatch):
764
+ monkeypatch.setenv("BENCHFLOW_AGENTCORE_ROLE_ARN", "arn:aws:iam::1:role/rt")
765
+ monkeypatch.setenv("BENCHFLOW_AGENTCORE_NETWORK_MODE", "VPC")
766
+ monkeypatch.setenv("BENCHFLOW_AGENTCORE_SUBNETS", "subnet-0a1b2c3d4e5f67890")
767
+ monkeypatch.setenv(
768
+ "BENCHFLOW_AGENTCORE_SECURITY_GROUPS", "sg-0a1b2c3d4e5f67890"
769
+ )
770
+
771
+ def _adopt(self, found):
772
+ control = MagicMock()
773
+ control.get_agent_runtime.return_value = {
774
+ "agentRuntimeArtifact": {
775
+ "containerConfiguration": {"containerUri": "repo@sha256:a"}
776
+ },
777
+ "lifecycleConfiguration": {
778
+ "idleRuntimeSessionTimeout": 600,
779
+ "maxLifetime": 7200,
780
+ },
781
+ "roleArn": "arn:aws:iam::1:role/rt",
782
+ "networkConfiguration": found,
783
+ "protocolConfiguration": {"serverProtocol": "HTTP"},
784
+ }
785
+ AgentCoreSandbox._verify_adopted_runtime(
786
+ control,
787
+ "rt-1",
788
+ "repo@sha256:a",
789
+ {"idleRuntimeSessionTimeout": 600, "maxLifetime": 7200},
790
+ "arn:aws:iam::1:role/rt",
791
+ _VPC_NETWORK,
792
+ {"serverProtocol": "HTTP"},
793
+ )
794
+
795
+ def test_a_service_managed_member_does_not_block_adoption(self):
796
+ """``VpcConfig`` carries members BenchFlow never sends.
797
+
798
+ ``requireServiceS3Endpoint`` cannot even be set on create. Adoption is
799
+ the path every rollout after the first takes, so comparing the whole
800
+ document would fail a VPC matrix on everything after its first create.
801
+
802
+ Guards PR #1082 against the whole-document comparison it replaced.
803
+ """
804
+ self._adopt(
805
+ {
806
+ "networkMode": "VPC",
807
+ "networkModeConfig": {
808
+ **_VPC_NETWORK["networkModeConfig"],
809
+ "requireServiceS3Endpoint": True,
810
+ },
811
+ }
812
+ )
813
+
814
+ def test_a_different_subnet_is_still_refused(self):
815
+ """Tolerating extra members must not tolerate the wrong network."""
816
+ from benchflow.sandbox.protocol import SandboxStartupError
817
+
818
+ with pytest.raises(SandboxStartupError, match="does not match"):
819
+ self._adopt(
820
+ {
821
+ "networkMode": "VPC",
822
+ "networkModeConfig": {
823
+ "subnets": ["subnet-0987654321fedcba"],
824
+ "securityGroups": ["sg-0a1b2c3d4e5f67890"],
825
+ },
826
+ }
827
+ )
828
+
829
+ @pytest.mark.asyncio
830
+ async def test_registration_sends_the_configured_vpc(self, tmp_path, monkeypatch):
831
+ self._vpc_env(monkeypatch)
832
+ env = _sandbox(_make_task(tmp_path))
833
+ control = MagicMock()
834
+ control.create_agent_runtime.return_value = {
835
+ "agentRuntimeId": "rt-1",
836
+ "agentRuntimeArn": "arn:rt",
837
+ }
838
+ control.get_agent_runtime.return_value = {"status": "READY"}
839
+
840
+ with patch.object(env, "_client", return_value=control):
841
+ await env._create_or_adopt_runtime("bf_x", "repo@sha256:a")
842
+
843
+ sent = control.create_agent_runtime.call_args.kwargs
844
+ assert sent["networkConfiguration"] == _VPC_NETWORK
845
+
846
+ @pytest.mark.asyncio
847
+ async def test_repointing_a_stale_runtime_keeps_the_vpc(
848
+ self, tmp_path, monkeypatch
849
+ ):
850
+ """``update_agent_runtime`` replaces the whole config it is given.
851
+
852
+ Omitting the network here is how a VPC runtime silently reverts to
853
+ PUBLIC on the next image change.
854
+ """
855
+ from botocore.exceptions import ClientError
856
+
857
+ self._vpc_env(monkeypatch)
858
+ env = _sandbox(_make_task(tmp_path))
859
+ control = MagicMock()
860
+ control.create_agent_runtime.side_effect = ClientError(
861
+ {"Error": {"Code": "ConflictException", "Message": "exists"}},
862
+ "CreateAgentRuntime",
863
+ )
864
+ control.get_agent_runtime.return_value = {
865
+ "status": "READY",
866
+ "agentRuntimeArtifact": {
867
+ "containerConfiguration": {"containerUri": "repo@sha256:b"}
868
+ },
869
+ "lifecycleConfiguration": env._lifecycle_configuration(),
870
+ "roleArn": "arn:aws:iam::1:role/rt",
871
+ "networkConfiguration": _VPC_NETWORK,
872
+ "protocolConfiguration": {"serverProtocol": "HTTP"},
873
+ }
874
+
875
+ with (
876
+ patch.object(env, "_client", return_value=control),
877
+ patch.object(
878
+ provisioning,
879
+ "find_runtime_by_name",
880
+ return_value=("arn:rt", "rt-1", "repo@sha256:a"),
881
+ ),
882
+ ):
883
+ await env._create_or_adopt_runtime("bf_x", "repo@sha256:b")
884
+
885
+ sent = control.update_agent_runtime.call_args.kwargs
886
+ assert sent["networkConfiguration"] == _VPC_NETWORK
887
+
888
+ def test_a_vpc_runtime_does_not_share_an_identity_with_a_public_one(
889
+ self, tmp_path, monkeypatch
890
+ ):
891
+ """Same name means the VPC run adopts the existing PUBLIC runtime."""
892
+ monkeypatch.setenv("BENCHFLOW_AGENTCORE_ROLE_ARN", "arn:aws:iam::1:role/rt")
893
+ env = _sandbox(_make_task(tmp_path))
894
+ public = env._runtime_contract_digest("sha256:a")
895
+
896
+ self._vpc_env(monkeypatch)
897
+
898
+ assert env._runtime_contract_digest("sha256:a") != public
899
+
900
+
746
901
  class TestDeprecatedCleanupAliasIsSafe:
747
902
  """`bench environment cleanup` reaches the same destructive code.
748
903