benchflow 0.5.3.dev978__tar.gz → 0.5.3.dev983__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/CHANGELOG.md +17 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/PKG-INFO +2 -2
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/pyproject.toml +3 -2
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/evaluation.py +15 -5
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout.py +13 -4
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_results.py +107 -1
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dataset_registry.py +73 -24
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_integration_check_results.py +254 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/.gitignore +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/LICENSE +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/README.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_dotenv.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_paths.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_run.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_types.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/benchmark_repos.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/dataset_registry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/evaluation_results.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/json_safe.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/learner_memory.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/result_metadata.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/reward_events.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/scoring.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/source_provenance.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/task_authoring.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/_utils/yaml_loader.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/client.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/container_transport.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/session.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/transport.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/acp/types.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/harbor.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/inbound.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/inspect_ai.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/ors.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/adapters/terminal_bench.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/codex_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/credentials.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/errors.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/install.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/pi_acp_launcher.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/providers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/agents/registry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/branch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/continue_cmd.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/main.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/cli/trace_import.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/compat/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/compat/harbor_registry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/batch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/orchestrator.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/replay_proxy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/run_folder.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/planes.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/contracts/user.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/environment/Dockerfile +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/demo_task/tests/test.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/diagnostics.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/manifest_env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/environment/readiness.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/eval_sharding.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/eval_worker.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/hooks.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/hosted_env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/learner_skills.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/learner_store.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/metrics.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/models.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/monitor.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_logging.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/litellm_runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/providers/runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/py.typed +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/README.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/builtins.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/events.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/file_readers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/llm.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/memory_scorer.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/node.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/rubric.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/rubric_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rewards/validation.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout_branch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/rollout_planes.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_base.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/_sdk_ops.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/daytona.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/docker.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/lockdown.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/metadata.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/modal_impl.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/process.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/services.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/setup.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/snapshot.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sandbox/user.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/scenes.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/sdk.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/self_gen.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/_core.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/gepa_export.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_eval/schema.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skill_policy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/skills.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/paths.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/task.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/task/verifier.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/judge.py.tmpl +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/templates/test.sh.tmpl +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/huggingface.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/local.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/models.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/parsers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/traces/task_gen.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/_capture.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/export.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/metrics.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/otel.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/tree.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/types.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/trajectories/viewer.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/src/benchflow/usage_tracking.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/agents/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/agents/test_protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/README.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/acp_smoke/tests/test.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/conformance-results.json +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/proof_multi_agent.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/proof_snapshot.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/run_conformance.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/conftest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/_helpers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_batch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_orchestrator.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_replay_proxy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/continue_run/test_run_folder.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_chibench_manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_clawsbench_manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_manifest_env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/environment/test_readiness.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/solution/solve.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/hello-world-task/tests/test.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/environment/Dockerfile +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/solution/solve.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/tests/test.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/terminal-bench-smoke-task/tests/test_state.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_claude.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_codex.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_codex_custom_provider.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_gemini.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/test_openclaw.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/traces/minimal-claude.jsonl +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/README.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/instruction.md +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/beta-task/task.toml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/fixtures/mock_openai_responses_server.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_adapter_evidence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_hosted_env_evidence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/check_trace_to_task_evidence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/claude-agent-acp.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/codex-acp.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/gemini.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/openclaw.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/opencode.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/openhands.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/configs/pi-acp.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/run.sh +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/run_suite.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/integration/suites/release.yaml +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_capability_advertising.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_model_config_dispatch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_pinned_protocol_guard.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_acp_setup_failure_propagation.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_adapter_scripts.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_adapters.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_cli.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_env_resolution.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_gemini_defaults.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_idle_timeout_cli.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_model_decouple.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_registry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_setup.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_agent_spec.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_base_install_imports.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_bedrock_thinking.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_branch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_capture_trajectory.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_clawsbench_slice.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_daytona.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_docs_drift.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_cli_misc.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_compat_harbor_registry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_config_redaction.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_connect_as_env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_continuallearningbench_adapter.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_credential_env_scrub.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_daytona_key.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_no_host_paths.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_release_evidence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_roadmap.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_symlink_ingestion.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_dashboard_sync.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_command_polling.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_litellm_runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_daytona_status.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docker_prune_scoping.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docker_uploads.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_docs_examples.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eng50_capabilities.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_env_setup.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_environment_manifest_controls.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_filters_applied.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_sharding.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_single_task_summary.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_source_provenance.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_worker_retry.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_eval_zero_task_guard.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_evaluation_environment_manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_exclude_tasks.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_experiments_status.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_harvey_lab_shim.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hf_scores.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hilbench_adapter.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hosted_env.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_hosted_env_rollout_contract.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_inbound_adapter_manifest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_inbound_adapters.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_integration_run_suite.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_internet_policy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job_sequential_shared.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_job_sequential_shared_resume.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_judge_symlink_ingestion.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_skills.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_skills_traversal.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_store.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_learner_store_persistence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_hardening.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_logging.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_litellm_smoke.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge_event_tags.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_llm_judge_verifier.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_memory_scorer.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_metrics.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_mock_openai_responses_server.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_monitor_scaffold.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_native_acp_usage.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_no_cross_provider_fallback.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_notification_order_real.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_oracle.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_oracle_chokepoint.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_paths_safe.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_paths_symlink_helpers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_pi_acp_launcher.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_process.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_provider_auth_detection.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_providers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reexport.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_registry_invariants.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_release_version.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_resolve_env_helpers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reward_node.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_reward_unified_contract.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rewards.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rewards_jsonl.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_architecture.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_branch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_config_path_coercion.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_environment.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_import_no_side_effects.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_on_ask_user_wiring.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_probe_sandbox_health.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rollout_upload.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_rubric_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime_config_wired.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_runtime_live_sandbox.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_exec_secret_handling.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_hardening.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_multi_service.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_protocol.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_setup.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_snapshot_contract.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_upload_symlink.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sandbox_verifier_workspace.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_outbox_trial.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_parallel_group.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scene_result_aggregation.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_scoring.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sdk_internals.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_sdk_lockdown.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_cli.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_export_error_channel.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_export_failures.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_self_gen_orchestration.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_session_request_permission_dispatch.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_dryrun.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_integration.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_sweep.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_eval_traversal.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_invocation_artifacts.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skill_policy.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skills.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skills_dir_agent_home_link.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_harbor_run_suite.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_skillsbench_publish_scrub.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_smoke.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_subscription_auth.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_check_eval_consistency.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_digest.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_task_download.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_tasks.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_token_usage_normalization.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_import_cli.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_task_gen_traversal.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trace_to_task_evidence.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_huggingface.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_parsers.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_traces_task_gen.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_train_mode_artifact_emission.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trajectory_integration.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trajectory_streaming.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_agent_timeout_verify.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_install_agent_timeout.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_trial_litellm_runtime.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_litellm.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_required.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_usage_tracking.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_user.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_multi_container.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_output.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verifier_output_freshness.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_verify.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_workflow_action_pinning.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/test_yaml_config.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/__init__.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_export.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_export_nan_handling.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_redaction.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_step_granularity.py +0 -0
- {benchflow-0.5.3.dev978 → benchflow-0.5.3.dev983}/tests/trajectories/test_tree.py +0 -0
|
@@ -4,6 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
### Added
|
|
6
6
|
|
|
7
|
+
- **Registry-pinned dataset runs** — `bench eval create -d name@version`
|
|
8
|
+
(e.g. `-d skillsbench@1.1`) resolves a dataset from a git-backed
|
|
9
|
+
`registry.json` (see skillsbench `docs/dataset-versioning.md`): tasks are
|
|
10
|
+
cloned at their pinned `git_commit_id` into `.cache/datasets` and every
|
|
11
|
+
task directory is verified against its sha256 content digest before
|
|
12
|
+
anything runs; the entry's `bench_version` range is checked against the
|
|
13
|
+
installed benchflow. `--registry` overrides the default (skillsbench)
|
|
14
|
+
registry. `result.json`/`config.json` are stamped with `dataset_name`,
|
|
15
|
+
`dataset_version`, and a per-task `task_digest` (`summary.json` carries
|
|
16
|
+
the name/version); `--tasks-dir` dev runs carry no dataset fields but
|
|
17
|
+
still stamp a live-computed `task_digest`, so every trajectory stays
|
|
18
|
+
attributable to exact task content. `bench tasks digest <dir>` prints
|
|
19
|
+
the digest for task authoring, and `check_results.py` audits the stamps.
|
|
20
|
+
See [`docs/running-benchmarks.md`](docs/running-benchmarks.md). (#689,
|
|
21
|
+
#690, #691; `packaging` promoted to a core dependency for the
|
|
22
|
+
`bench_version` check.)
|
|
23
|
+
|
|
7
24
|
- **`benchflow continue <run-folder>`** — resume a previous, unfinished
|
|
8
25
|
(timed-out) `openhands` run to completion. A standalone tool (it does not
|
|
9
26
|
touch the normal run path) that reconstructs the run's exact workspace and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: benchflow
|
|
3
|
-
Version: 0.5.3.
|
|
3
|
+
Version: 0.5.3.dev983
|
|
4
4
|
Summary: Multi-turn agent benchmarking with ACP — run any agent, any model, any provider.
|
|
5
5
|
Project-URL: Homepage, https://github.com/benchflow-ai/benchflow
|
|
6
6
|
Project-URL: Repository, https://github.com/benchflow-ai/benchflow
|
|
@@ -22,6 +22,7 @@ Requires-Dist: agent-client-protocol>=0.10
|
|
|
22
22
|
Requires-Dist: anyio>=4.0
|
|
23
23
|
Requires-Dist: httpx>=0.27.0
|
|
24
24
|
Requires-Dist: litellm[proxy]==1.88.0rc1
|
|
25
|
+
Requires-Dist: packaging>=24
|
|
25
26
|
Requires-Dist: pydantic>=2.7
|
|
26
27
|
Requires-Dist: pyyaml>=6.0
|
|
27
28
|
Requires-Dist: rich>=13.0
|
|
@@ -30,7 +31,6 @@ Requires-Dist: typer>=0.9
|
|
|
30
31
|
Provides-Extra: bedrock
|
|
31
32
|
Requires-Dist: boto3>=1.40; extra == 'bedrock'
|
|
32
33
|
Provides-Extra: dev
|
|
33
|
-
Requires-Dist: packaging>=24; extra == 'dev'
|
|
34
34
|
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
35
35
|
Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
|
|
36
36
|
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "benchflow"
|
|
3
|
-
version = "0.5.3.
|
|
3
|
+
version = "0.5.3.dev983"
|
|
4
4
|
description = "Multi-turn agent benchmarking with ACP — run any agent, any model, any provider."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -12,6 +12,8 @@ dependencies = [
|
|
|
12
12
|
"pydantic>=2.7",
|
|
13
13
|
"pyyaml>=6.0",
|
|
14
14
|
"rich>=13.0",
|
|
15
|
+
# Dataset registry bench_version checks (PEP 440 specifier sets).
|
|
16
|
+
"packaging>=24",
|
|
15
17
|
"litellm[proxy]==1.88.0rc1",
|
|
16
18
|
"tomli-w>=1.0",
|
|
17
19
|
"typer>=0.9",
|
|
@@ -38,7 +40,6 @@ classifiers = [
|
|
|
38
40
|
|
|
39
41
|
[project.optional-dependencies]
|
|
40
42
|
dev = [
|
|
41
|
-
"packaging>=24",
|
|
42
43
|
"pre-commit>=3.7",
|
|
43
44
|
"pytest>=9.0.3",
|
|
44
45
|
"pytest-asyncio>=0.24.0",
|
|
@@ -826,11 +826,20 @@ class Evaluation:
|
|
|
826
826
|
|
|
827
827
|
dataset = None
|
|
828
828
|
if cfg.dataset_name:
|
|
829
|
-
dataset = {
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
829
|
+
dataset = {"name": cfg.dataset_name, "version": cfg.dataset_version}
|
|
830
|
+
task_digest_value = (
|
|
831
|
+
cfg.dataset_task_digests.get(task_dir.name) if cfg.dataset_name else None
|
|
832
|
+
)
|
|
833
|
+
if task_digest_value is None:
|
|
834
|
+
# Dev runs (--tasks-dir / --source-repo) stamp a live-computed
|
|
835
|
+
# digest so every trajectory stays attributable to the exact
|
|
836
|
+
# task content it ran, not just a directory name.
|
|
837
|
+
from benchflow._utils.task_authoring import task_digest
|
|
838
|
+
|
|
839
|
+
try:
|
|
840
|
+
task_digest_value = task_digest(task_dir)
|
|
841
|
+
except (OSError, ValueError, UnicodeError) as e:
|
|
842
|
+
logger.debug("Could not compute task digest for %s: %s", task_dir, e)
|
|
834
843
|
skills_dir = (
|
|
835
844
|
str(self._learner_skills_dir)
|
|
836
845
|
if self._learner_skills_dir is not None
|
|
@@ -870,6 +879,7 @@ class Evaluation:
|
|
|
870
879
|
export_generated_skills_to=export_to,
|
|
871
880
|
source_provenance=task_source_provenance(cfg.source_provenance, task_dir),
|
|
872
881
|
dataset=dataset,
|
|
882
|
+
task_digest=task_digest_value,
|
|
873
883
|
usage_tracking=cfg.usage_tracking,
|
|
874
884
|
)
|
|
875
885
|
if skill_mode == SKILL_MODE_SELF_GEN:
|
|
@@ -526,6 +526,7 @@ def _write_config(
|
|
|
526
526
|
scenes: list[Scene] | None = None,
|
|
527
527
|
source_provenance: dict[str, Any] | None = None,
|
|
528
528
|
dataset: dict[str, Any] | None = None,
|
|
529
|
+
task_digest: str | None = None,
|
|
529
530
|
) -> None:
|
|
530
531
|
"""Write config.json to rollout_dir with secrets filtered out."""
|
|
531
532
|
recorded_env = {
|
|
@@ -556,7 +557,8 @@ def _write_config(
|
|
|
556
557
|
if dataset is not None:
|
|
557
558
|
config_data["dataset_name"] = dataset.get("name")
|
|
558
559
|
config_data["dataset_version"] = dataset.get("version")
|
|
559
|
-
|
|
560
|
+
if task_digest is not None:
|
|
561
|
+
config_data["task_digest"] = task_digest
|
|
560
562
|
(rollout_dir / "config.json").write_text(json.dumps(config_data, indent=2))
|
|
561
563
|
|
|
562
564
|
|
|
@@ -622,6 +624,7 @@ def _build_rollout_result(
|
|
|
622
624
|
evolved_skills: dict[str, str] | None = None,
|
|
623
625
|
source_provenance: dict[str, Any] | None = None,
|
|
624
626
|
dataset: dict[str, Any] | None = None,
|
|
627
|
+
task_digest: str | None = None,
|
|
625
628
|
diagnostics: RolloutDiagnostics | None = None,
|
|
626
629
|
skill_policy: TaskSkillPolicy | None = None,
|
|
627
630
|
sandbox_id: str | None = None,
|
|
@@ -753,11 +756,11 @@ def _build_rollout_result(
|
|
|
753
756
|
{
|
|
754
757
|
"dataset_name": dataset.get("name"),
|
|
755
758
|
"dataset_version": dataset.get("version"),
|
|
756
|
-
"task_digest": dataset.get("task_digest"),
|
|
757
759
|
}
|
|
758
760
|
if dataset is not None
|
|
759
761
|
else {}
|
|
760
762
|
),
|
|
763
|
+
**({"task_digest": task_digest} if task_digest is not None else {}),
|
|
761
764
|
"sandbox_id": sandbox_id,
|
|
762
765
|
},
|
|
763
766
|
indent=2,
|
|
@@ -1107,10 +1110,14 @@ class RolloutConfig:
|
|
|
1107
1110
|
skip_verify: bool = False
|
|
1108
1111
|
export_generated_skills_to: str | Path | None = None
|
|
1109
1112
|
source_provenance: dict[str, Any] | None = None
|
|
1110
|
-
# Registry dataset identity
|
|
1111
|
-
#
|
|
1113
|
+
# Registry dataset identity: {"name", "version"} — stamped into
|
|
1114
|
+
# config.json/result.json as dataset_name/dataset_version so published
|
|
1112
1115
|
# runs declare the dataset version they ran (dataset-versioning plan).
|
|
1113
1116
|
dataset: dict[str, Any] | None = None
|
|
1117
|
+
# Content digest of the task directory ("sha256:<hex>", the skillsbench
|
|
1118
|
+
# registry algorithm). Registry-pinned for dataset runs, computed live
|
|
1119
|
+
# for dev runs — every result stays attributable to exact task content.
|
|
1120
|
+
task_digest: str | None = None
|
|
1114
1121
|
planes: RolloutPlanes | None = field(default=None, repr=False, compare=False)
|
|
1115
1122
|
|
|
1116
1123
|
def __post_init__(self) -> None:
|
|
@@ -1560,6 +1567,7 @@ class Rollout:
|
|
|
1560
1567
|
scenes=cfg.effective_scenes,
|
|
1561
1568
|
source_provenance=cfg.source_provenance,
|
|
1562
1569
|
dataset=cfg.dataset,
|
|
1570
|
+
task_digest=cfg.task_digest,
|
|
1563
1571
|
)
|
|
1564
1572
|
|
|
1565
1573
|
self._phase = "setup"
|
|
@@ -2927,6 +2935,7 @@ class Rollout:
|
|
|
2927
2935
|
evolved_skills=self._evolved_skills,
|
|
2928
2936
|
source_provenance=self._config.source_provenance,
|
|
2929
2937
|
dataset=self._config.dataset,
|
|
2938
|
+
task_digest=self._config.task_digest,
|
|
2930
2939
|
diagnostics=self._diagnostics,
|
|
2931
2940
|
usage_tracking=self._usage_tracking_metadata(),
|
|
2932
2941
|
skill_policy=getattr(self, "_task_skill_policy", None)
|
|
@@ -32,7 +32,11 @@ from benchflow._utils.scoring import (
|
|
|
32
32
|
classify_verifier_error,
|
|
33
33
|
count_result_outcomes,
|
|
34
34
|
)
|
|
35
|
-
from benchflow._utils.source_provenance import
|
|
35
|
+
from benchflow._utils.source_provenance import (
|
|
36
|
+
is_sha256_digest,
|
|
37
|
+
source_issues,
|
|
38
|
+
source_matches_parent,
|
|
39
|
+
)
|
|
36
40
|
from benchflow.trajectories.metrics import (
|
|
37
41
|
count_skill_invocations,
|
|
38
42
|
result_skill_invocations,
|
|
@@ -304,6 +308,73 @@ def _source_hash_truth_issues(source: object, label: str) -> list[str]:
|
|
|
304
308
|
return _source_git_truth_issues(source_dict, local_path, label)
|
|
305
309
|
|
|
306
310
|
|
|
311
|
+
# Dataset identity stamp (dataset-versioning plan: benchflow #690 + dev-run
|
|
312
|
+
# digest stamping follow-up). dataset_name/dataset_version mark registry
|
|
313
|
+
# dataset runs; task_digest pins the exact task content for every run.
|
|
314
|
+
_DATASET_STAMP_KEYS = ("dataset_name", "dataset_version", "task_digest")
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def _dataset_stamp_issues(artifact: object, label: str) -> list[str]:
|
|
318
|
+
"""Audit the dataset identity stamp on one result.json/config.json.
|
|
319
|
+
|
|
320
|
+
Rules: dataset_name and dataset_version travel together; a dataset run
|
|
321
|
+
must carry a task_digest; any task_digest must be ``sha256:<64 hex>``.
|
|
322
|
+
A bare task_digest without dataset fields is a dev run — allowed.
|
|
323
|
+
"""
|
|
324
|
+
if not isinstance(artifact, dict):
|
|
325
|
+
return []
|
|
326
|
+
artifact_dict = cast(dict[str, Any], artifact)
|
|
327
|
+
name = artifact_dict.get("dataset_name")
|
|
328
|
+
version = artifact_dict.get("dataset_version")
|
|
329
|
+
digest = artifact_dict.get("task_digest")
|
|
330
|
+
if name is None and version is None and digest is None:
|
|
331
|
+
return []
|
|
332
|
+
issues: list[str] = []
|
|
333
|
+
if (name is None) != (version is None):
|
|
334
|
+
issues.append(f"{label}: dataset_name and dataset_version must travel together")
|
|
335
|
+
for field_name, value in (("dataset_name", name), ("dataset_version", version)):
|
|
336
|
+
if value is not None and (not isinstance(value, str) or not value):
|
|
337
|
+
issues.append(f"{label}: {field_name} must be a non-empty string")
|
|
338
|
+
if name is not None and digest is None:
|
|
339
|
+
issues.append(f"{label}: dataset-stamped artifact missing task_digest")
|
|
340
|
+
if digest is not None and not is_sha256_digest(digest):
|
|
341
|
+
issues.append(f"{label}: task_digest must be 'sha256:<64 hex>'")
|
|
342
|
+
return issues
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _task_digest_truth_issues(result: object, label: str) -> list[str]:
|
|
346
|
+
"""Recompute the task content digest when the task dir is still on disk.
|
|
347
|
+
|
|
348
|
+
Complements ``_source_hash_truth_issues``: ``source.file_hashes`` audits
|
|
349
|
+
per-file hashes, this audits the single registry-algorithm digest the
|
|
350
|
+
leaderboard pipeline keys on.
|
|
351
|
+
"""
|
|
352
|
+
if not isinstance(result, dict):
|
|
353
|
+
return []
|
|
354
|
+
result_dict = cast(dict[str, Any], result)
|
|
355
|
+
digest = result_dict.get("task_digest")
|
|
356
|
+
if not is_sha256_digest(digest):
|
|
357
|
+
return [] # absent or malformed — format issues reported elsewhere
|
|
358
|
+
source = result_dict.get("source")
|
|
359
|
+
if not isinstance(source, dict):
|
|
360
|
+
return []
|
|
361
|
+
local_path_raw = source.get("local_path")
|
|
362
|
+
if not isinstance(local_path_raw, str):
|
|
363
|
+
return []
|
|
364
|
+
local_path = Path(local_path_raw)
|
|
365
|
+
if not (local_path / "task.toml").exists():
|
|
366
|
+
return []
|
|
367
|
+
try:
|
|
368
|
+
from benchflow._utils.task_authoring import task_digest
|
|
369
|
+
|
|
370
|
+
actual = task_digest(local_path)
|
|
371
|
+
except Exception as e:
|
|
372
|
+
return [f"{label}: task_digest could not be recomputed: {e}"]
|
|
373
|
+
if actual != digest:
|
|
374
|
+
return [f"{label}: task_digest does not match local_path content"]
|
|
375
|
+
return []
|
|
376
|
+
|
|
377
|
+
|
|
307
378
|
def _git_stdout(cwd: Path, *args: str) -> str | None:
|
|
308
379
|
completed = subprocess.run(
|
|
309
380
|
["git", "-C", str(cwd), *args],
|
|
@@ -535,6 +606,18 @@ def check_agent(agent_dir: Path) -> dict:
|
|
|
535
606
|
if source_truth_issues:
|
|
536
607
|
findings["issues"].extend(source_truth_issues)
|
|
537
608
|
findings["ok"] = False
|
|
609
|
+
dataset_stamp_issues = _dataset_stamp_issues(
|
|
610
|
+
r, f"{r.get('task_name', '?')}: result.json"
|
|
611
|
+
)
|
|
612
|
+
if dataset_stamp_issues:
|
|
613
|
+
findings["issues"].extend(dataset_stamp_issues)
|
|
614
|
+
findings["ok"] = False
|
|
615
|
+
digest_truth_issues = _task_digest_truth_issues(
|
|
616
|
+
r, f"{r.get('task_name', '?')}: result.json"
|
|
617
|
+
)
|
|
618
|
+
if digest_truth_issues:
|
|
619
|
+
findings["issues"].extend(digest_truth_issues)
|
|
620
|
+
findings["ok"] = False
|
|
538
621
|
_config_path, config, config_error = _load_config(result_file)
|
|
539
622
|
if config_error:
|
|
540
623
|
findings["issues"].append(f"{r.get('task_name', '?')}: {config_error}")
|
|
@@ -639,6 +722,18 @@ def check_agent(agent_dir: Path) -> dict:
|
|
|
639
722
|
f"{r.get('task_name', '?')}: config.json source does not match result.json"
|
|
640
723
|
)
|
|
641
724
|
findings["ok"] = False
|
|
725
|
+
config_dataset_issues = _dataset_stamp_issues(
|
|
726
|
+
config, f"{r.get('task_name', '?')}: config.json"
|
|
727
|
+
)
|
|
728
|
+
if config_dataset_issues:
|
|
729
|
+
findings["issues"].extend(config_dataset_issues)
|
|
730
|
+
findings["ok"] = False
|
|
731
|
+
if any(config.get(k) != r.get(k) for k in _DATASET_STAMP_KEYS):
|
|
732
|
+
findings["issues"].append(
|
|
733
|
+
f"{r.get('task_name', '?')}: config.json dataset stamp "
|
|
734
|
+
f"does not match result.json"
|
|
735
|
+
)
|
|
736
|
+
findings["ok"] = False
|
|
642
737
|
|
|
643
738
|
# Infrastructure errors — driven from the central diagnostic registry
|
|
644
739
|
# so adding a new diagnostic kind doesn't require editing this file
|
|
@@ -768,6 +863,17 @@ def check_agent(agent_dir: Path) -> dict:
|
|
|
768
863
|
"summary.json missing source provenance and not all results have source"
|
|
769
864
|
)
|
|
770
865
|
findings["ok"] = False
|
|
866
|
+
# Dataset identity must agree across summary.json and every
|
|
867
|
+
# result.json — one leaderboard namespace per dataset version.
|
|
868
|
+
for dataset_key in ("dataset_name", "dataset_version"):
|
|
869
|
+
dataset_values = {r.get(dataset_key) for r in results}
|
|
870
|
+
dataset_values.add(summary.get(dataset_key))
|
|
871
|
+
if len(dataset_values) > 1:
|
|
872
|
+
findings["issues"].append(
|
|
873
|
+
f"summary.json {dataset_key} does not agree across "
|
|
874
|
+
f"summary and results: {sorted(map(repr, dataset_values))}"
|
|
875
|
+
)
|
|
876
|
+
findings["ok"] = False
|
|
771
877
|
expected_model = _expected(agent, "model")
|
|
772
878
|
expected_environment = _expected(agent, "environment")
|
|
773
879
|
expected_concurrency = _expected(agent, "concurrency")
|
|
@@ -324,19 +324,20 @@ class TestEvalCreateDatasetCli:
|
|
|
324
324
|
|
|
325
325
|
|
|
326
326
|
class TestDatasetStamping:
|
|
327
|
-
DATASET: ClassVar[dict] = {
|
|
328
|
-
|
|
329
|
-
"version": "1.1",
|
|
330
|
-
"task_digest": "sha256:" + "f" * 64,
|
|
331
|
-
}
|
|
327
|
+
DATASET: ClassVar[dict] = {"name": "skillsbench", "version": "1.1"}
|
|
328
|
+
TASK_DIGEST = "sha256:" + "f" * 64
|
|
332
329
|
|
|
333
330
|
def test_rollout_config_threads_dataset_through_from_legacy(self, tmp_path):
|
|
334
331
|
from benchflow.rollout import RolloutConfig
|
|
335
332
|
|
|
336
333
|
cfg = RolloutConfig.from_legacy(
|
|
337
|
-
task_path=tmp_path,
|
|
334
|
+
task_path=tmp_path,
|
|
335
|
+
agent="oracle",
|
|
336
|
+
dataset=self.DATASET,
|
|
337
|
+
task_digest=self.TASK_DIGEST,
|
|
338
338
|
)
|
|
339
339
|
assert cfg.dataset == self.DATASET
|
|
340
|
+
assert cfg.task_digest == self.TASK_DIGEST
|
|
340
341
|
|
|
341
342
|
def test_config_json_stamped(self, tmp_path):
|
|
342
343
|
from benchflow.rollout import _write_config
|
|
@@ -361,11 +362,12 @@ class TestDatasetStamping:
|
|
|
361
362
|
started_at=datetime(2026, 6, 12),
|
|
362
363
|
agent_env={},
|
|
363
364
|
dataset=self.DATASET,
|
|
365
|
+
task_digest=self.TASK_DIGEST,
|
|
364
366
|
)
|
|
365
367
|
config = json.loads((tmp_path / "config.json").read_text())
|
|
366
368
|
assert config["dataset_name"] == "skillsbench"
|
|
367
369
|
assert config["dataset_version"] == "1.1"
|
|
368
|
-
assert config["task_digest"] == self.
|
|
370
|
+
assert config["task_digest"] == self.TASK_DIGEST
|
|
369
371
|
|
|
370
372
|
def test_config_json_unstamped_without_dataset(self, tmp_path):
|
|
371
373
|
from benchflow.rollout import _write_config
|
|
@@ -392,6 +394,7 @@ class TestDatasetStamping:
|
|
|
392
394
|
)
|
|
393
395
|
config = json.loads((tmp_path / "config.json").read_text())
|
|
394
396
|
assert "dataset_name" not in config
|
|
397
|
+
assert "task_digest" not in config
|
|
395
398
|
|
|
396
399
|
def test_result_json_stamped(self, tmp_path):
|
|
397
400
|
from benchflow.rollout import _build_rollout_result
|
|
@@ -413,13 +416,57 @@ class TestDatasetStamping:
|
|
|
413
416
|
started_at=datetime(2026, 6, 12),
|
|
414
417
|
timing={},
|
|
415
418
|
dataset=self.DATASET,
|
|
419
|
+
task_digest=self.TASK_DIGEST,
|
|
416
420
|
)
|
|
417
421
|
result = json.loads((tmp_path / "result.json").read_text())
|
|
418
422
|
assert result["dataset_name"] == "skillsbench"
|
|
419
423
|
assert result["dataset_version"] == "1.1"
|
|
420
|
-
assert result["task_digest"] == self.
|
|
424
|
+
assert result["task_digest"] == self.TASK_DIGEST
|
|
425
|
+
|
|
426
|
+
def test_result_json_dev_run_stamps_digest_without_dataset(self, tmp_path):
|
|
427
|
+
"""Dev runs carry task_digest but no dataset identity fields."""
|
|
428
|
+
from benchflow.rollout import _build_rollout_result
|
|
429
|
+
|
|
430
|
+
_build_rollout_result(
|
|
431
|
+
tmp_path,
|
|
432
|
+
task_name="task-a",
|
|
433
|
+
rollout_name="task-a__r1",
|
|
434
|
+
agent="oracle",
|
|
435
|
+
agent_name="oracle",
|
|
436
|
+
model=None,
|
|
437
|
+
n_tool_calls=0,
|
|
438
|
+
prompts=[],
|
|
439
|
+
error=None,
|
|
440
|
+
verifier_error=None,
|
|
441
|
+
trajectory=[],
|
|
442
|
+
partial_trajectory=False,
|
|
443
|
+
rewards={"reward": 1.0},
|
|
444
|
+
started_at=datetime(2026, 6, 12),
|
|
445
|
+
timing={},
|
|
446
|
+
task_digest=self.TASK_DIGEST,
|
|
447
|
+
)
|
|
448
|
+
result = json.loads((tmp_path / "result.json").read_text())
|
|
449
|
+
assert result["task_digest"] == self.TASK_DIGEST
|
|
450
|
+
assert "dataset_name" not in result
|
|
451
|
+
assert "dataset_version" not in result
|
|
452
|
+
|
|
453
|
+
@staticmethod
|
|
454
|
+
def _capture_rollout_create(monkeypatch):
|
|
455
|
+
captured = {}
|
|
421
456
|
|
|
422
|
-
|
|
457
|
+
async def _fake_run():
|
|
458
|
+
return SimpleNamespace(rewards={"reward": 1.0})
|
|
459
|
+
|
|
460
|
+
async def fake_create(rollout_config):
|
|
461
|
+
captured["config"] = rollout_config
|
|
462
|
+
return SimpleNamespace(run=_fake_run)
|
|
463
|
+
|
|
464
|
+
monkeypatch.setattr("benchflow.rollout.Rollout.create", fake_create)
|
|
465
|
+
return captured
|
|
466
|
+
|
|
467
|
+
async def test_run_single_task_uses_registry_digest_for_dataset_runs(
|
|
468
|
+
self, tmp_path, monkeypatch
|
|
469
|
+
):
|
|
423
470
|
from benchflow.evaluation import Evaluation, EvaluationConfig
|
|
424
471
|
|
|
425
472
|
task_dir = _make_task(tmp_path / "tasks", "task-a")
|
|
@@ -430,24 +477,26 @@ class TestDatasetStamping:
|
|
|
430
477
|
dataset_version="1.1",
|
|
431
478
|
dataset_task_digests={"task-a": digest},
|
|
432
479
|
)
|
|
433
|
-
captured =
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
480
|
+
captured = self._capture_rollout_create(monkeypatch)
|
|
481
|
+
evaluation = Evaluation(
|
|
482
|
+
tasks_dir=tmp_path / "tasks", jobs_dir=tmp_path / "jobs", config=cfg
|
|
483
|
+
)
|
|
484
|
+
await evaluation._run_single_task(task_dir, cfg)
|
|
485
|
+
assert captured["config"].dataset == {"name": "skillsbench", "version": "1.1"}
|
|
486
|
+
assert captured["config"].task_digest == digest
|
|
440
487
|
|
|
441
|
-
|
|
442
|
-
|
|
488
|
+
async def test_run_single_task_computes_digest_for_dev_runs(
|
|
489
|
+
self, tmp_path, monkeypatch
|
|
490
|
+
):
|
|
491
|
+
"""Dev runs (no --dataset) stamp a live-computed content digest."""
|
|
492
|
+
from benchflow.evaluation import Evaluation, EvaluationConfig
|
|
443
493
|
|
|
444
|
-
|
|
494
|
+
task_dir = _make_task(tmp_path / "tasks", "task-a")
|
|
495
|
+
cfg = EvaluationConfig(agent="oracle")
|
|
496
|
+
captured = self._capture_rollout_create(monkeypatch)
|
|
445
497
|
evaluation = Evaluation(
|
|
446
498
|
tasks_dir=tmp_path / "tasks", jobs_dir=tmp_path / "jobs", config=cfg
|
|
447
499
|
)
|
|
448
500
|
await evaluation._run_single_task(task_dir, cfg)
|
|
449
|
-
assert captured["config"].dataset
|
|
450
|
-
|
|
451
|
-
"version": "1.1",
|
|
452
|
-
"task_digest": digest,
|
|
453
|
-
}
|
|
501
|
+
assert captured["config"].dataset is None
|
|
502
|
+
assert captured["config"].task_digest == task_digest(task_dir)
|