benchflow 0.6.7.dev1841__tar.gz → 0.6.7.dev1845__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.6.7.dev1841 → benchflow-0.6.7.dev1845}/PKG-INFO +1 -1
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/pyproject.toml +1 -1
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/live_activity.py +7 -4
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/_failure_evidence.py +151 -16
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/_live_progress.py +19 -9
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/_shared.py +40 -45
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/contracts/planes.py +16 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_runtime.py +56 -1
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/runtime.py +9 -2
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/__init__.py +60 -2
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_live_progress.py +331 -38
- benchflow-0.6.7.dev1845/tests/test_live_llm_trajectory.py +437 -0
- benchflow-0.6.7.dev1841/tests/test_live_llm_trajectory.py +0 -238
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/.gitignore +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/CHANGELOG.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/LICENSE +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/README.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_dotenv.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_paths.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_run.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_types.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/benchmark_repos.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/build_context_stage.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/config_override.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/content_address.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/dataset_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/env_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/evaluation_results.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/hf_datasets.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/json_safe.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/learner_memory.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/result_metadata.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/reward_events.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/scoring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/source_provenance.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/text.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/_utils/yaml_loader.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/client.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/container_transport.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/selection.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/session.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/transport.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/acp/types.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/_toolathlon.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/_toolathlon_container.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/_toolathlon_services.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/harbor.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/inbound.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/inspect_ai.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/ors.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/resources/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/adapters/source.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agent_router.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agent_router_guide.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agent_router_parity.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agent_router_scaffold.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/codex_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/credentials.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/errors.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/install.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/pi_acp_launcher.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/providers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/agents/remote_manifests.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/branch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/_hosted_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/_options.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/adopt.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/agent.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/continue_cmd.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/environment.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/eval_artifacts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/eval_lift.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/hub.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/main.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/monitor.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/review.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/sandbox.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/tasks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/trace_import.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/cli/train.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/batch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/orchestrator.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/replay_proxy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/run_folder.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/contracts/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/contracts/user.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/demo_task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/demo_task/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/demo_task/task.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/demo_task/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/demo_task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/diagnostics.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/manifest_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/environment/readiness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/eval_artifacts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/eval_lift.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/eval_plan.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/eval_sharding.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/eval_worker.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/evaluation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/experimental/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/experimental/mcp/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/experimental/mcp/hooks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/hosted_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/hub/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/hub/harbor_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/integrations/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/integrations/trl/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/integrations/trl/spec.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/learner_skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/learner_store.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/loop_strategies.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/loop_sweep.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/metrics.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/models.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/monitor.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_logging.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/publish/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/publish/huggingface.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/py.typed +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/default-rubric.json +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/prompts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/runner.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/review/wrapper.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/README.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/builtins.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/events.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/file_readers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/llm.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/memory_scorer.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/node.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/rubric.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/rubric_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rewards/validation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_deadline.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_results.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_setup.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_usage.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/_user_loop.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/session_factory_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout/task_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout_branch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/rollout_planes.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_base.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_compose.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/_sdk_ops.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore_builder.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore_image.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/apple_container.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/daytona.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/daytona_dind.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/daytona_pty.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/daytona_reaper.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/daytona_strategies.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/docker.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/lockdown.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/metadata.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/modal_impl.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/_base.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/agentcore.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/apple.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/daytona.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/process/docker.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/providers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/services.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/setup.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/snapshot.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sandbox/user.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/scenes.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/sdk.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/self_gen.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skill_eval/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skill_eval/_core.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skill_eval/gepa_export.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skill_eval/schema.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skill_policy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/_document_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/_document_normalize.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/_document_parse.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/_document_profiles.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/acceptance_live.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/acceptance_live_model.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/acceptance_live_report.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/acceptance_live_validation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/discovery.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/document.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/export.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/imports.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/output_format.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/package.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/paths.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/prompts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/runtime_capabilities.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/runtime_view.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/task.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_core.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_document.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_errors.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_judge_inputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_ors_episode.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_reward_kit.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_scan.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/task/verifier_script_strategy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/templates/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/templates/judge.py.tmpl +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/templates/test.sh.tmpl +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/huggingface.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/local.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/models.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/parsers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/traces/task_gen.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/training/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/training/backends/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/training/backends/prime_rl.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/training/run_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/_capture.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/_export_common.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/_llm_capture.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/call_purpose.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/export.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/export_adp.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/export_atif.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/export_prime_sft.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/export_trl_sft.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/metrics.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/results.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/tree.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/types.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/trajectories/viewer.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/usage_tracking.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/acceptance_live_harness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_manifest_dirscan.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_manifest_loader.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_manifest_parity.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_manifest_wiring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_namespace_shorthand.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_plugin_entry_points.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/agents/test_remote_manifest_autoload.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/README.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/task.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/acp_smoke/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/conformance-results.json +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/proof_multi_agent.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/proof_snapshot.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/run_conformance.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/conftest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/_helpers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/test_batch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/test_orchestrator.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/test_replay_proxy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/continue_run/test_run_folder.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_chibench_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_clawsbench_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_manifest_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/environment/test_readiness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/task.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/hello-world-task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/test_claude.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/test_codex.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/test_codex_custom_provider.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/test_gemini.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/test_openclaw.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/traces/minimal-claude.jsonl +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/README.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/alpha-task/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/beta-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/beta-task/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/mock_acp_agent.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/mock_openai_responses_server.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/_consistency.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/agent_judge.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/check_adapter_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/check_hosted_env_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/check_results.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/check_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/claude-agent-acp.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/codex-acp.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/gemini.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/mimo.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/openclaw.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/opencode.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/openhands.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/configs/pi-acp.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/deepagents_harness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/rubric_checks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/run.sh +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/run_suite.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/scenarios.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/integration/suites/release.yaml +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acceptance_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acceptance_live.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acceptance_live_execution.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp_capability_advertising.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp_mcp_servers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp_model_config_dispatch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp_pinned_protocol_guard.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_acp_setup_failure_propagation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_adapter_scripts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_adapters.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_env_resolution.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_gemini_defaults.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_idle_timeout_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_model_decouple.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_router.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_router_cli_e2e.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_router_scaffold.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_setup.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agent_spec.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agentcore_builder.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agentcore_parallel.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agentcore_reaper.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agentcore_sandbox.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_agentcore_transport.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_api_error_capture.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_apple_container_sandbox.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_bare_model_provider.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_base_install_imports.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_bedrock_thinking.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_benchflow_experiment_review_validator.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_branch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_build_context_stage.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_build_review_pack.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_capture_trajectory.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_clawsbench_slice.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_adopt_aliases.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_arg_validation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_daytona.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_docs_drift.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_edge_case_hardening.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_hub_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_cli_misc.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_codex_review.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_codex_self_write_auth.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_config_override.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_config_redaction.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_connect_as_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_console_error_truncation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_console_progress.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_continuallearningbench_adapter.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_dataset_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_command_polling.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_dind_compose_up.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_download.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_poll_deadline.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_daytona_reap.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_deepagents_agent.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_docker_prune_scoping.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_docker_uploads.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_docs_examples.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eng50_capabilities.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_env_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_env_setup.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_environment_manifest_controls.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_artifact_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_filters_applied.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_lift.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_sharding.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_single_task_summary.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_source_provenance.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_worker_retry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_eval_zero_task_guard.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_evaluation_environment_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_exclude_tasks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_filter_credentialed_cells.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_harvey_lab_shim.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_hilbench_adapter.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_hosted_env.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_hosted_env_rollout_contract.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_hub_harbor_registry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_inbound_adapter_manifest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_inbound_adapters.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_agent_judge.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_check_results.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_consistency.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_matrix.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_provider_selection.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_run_suite.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_integration_suite.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_internet_policy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_job.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_job_sequential_shared.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_job_sequential_shared_resume.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_judge_robustness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_judge_symlink_ingestion.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_learner_skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_learner_skills_traversal.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_learner_store.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_learner_store_persistence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_hardening.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_logging.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_model_via_env_generic.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_reasoning_passthrough.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_litellm_smoke.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_llm_judge.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_llm_judge_event_tags.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_llm_judge_verifier.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_loop_strategies.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_loop_summary.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_loop_sweep.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_memory_scorer.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_metrics.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_mle_bench_adapter.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_mock_openai_responses_server.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_monitor_scaffold.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_native_acp_usage.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_no_cross_provider_fallback.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_notification_order_real.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_opencode_family_proxy_tracking.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_oracle.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_oracle_chokepoint.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_paths_safe.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_paths_symlink_helpers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_pi_acp_launcher.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_pi_acp_proxy_routing.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_process.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_project_skills_layout.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_provider_auth_detection.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_providers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_reexport.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_registry_invariants.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_release_hardening_r5.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_release_version.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_release_workflow_wiring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_resolve_env_helpers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_review_boundaries.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_review_rubric.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_review_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_reward_lenient.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_reward_node.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_reward_range.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_reward_unified_contract.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rewards.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rewards_jsonl.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_architecture.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_branch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_config_path_coercion.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_environment.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_hard_deadline.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_import_no_side_effects.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_on_ask_user_wiring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_planes_contract.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_probe_sandbox_health.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_session_factory_dispatch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_setup_commands.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rollout_upload.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rubric_checks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_rubric_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_runtime_capabilities.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_runtime_config_wired.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_runtime_live_sandbox.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_exec_secret_handling.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_hardening.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_live_process.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_multi_service.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_prebuilt_validation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_protocol.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_provider_registry_drift.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_setup.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_snapshot_contract.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_upload_symlink.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sandbox_verifier_workspace.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_scene.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_scene_outbox_trial.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_scene_parallel_group.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_scene_result_aggregation.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_scoring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sdk_internals.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sdk_lockdown.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sdk_run_alias.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_sealed_channel_container.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_self_gen_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_self_gen_export_error_channel.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_self_gen_export_failures.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_self_gen_orchestration.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_session_factory_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_session_request_permission_dispatch.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_eval.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_eval_dryrun.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_eval_integration.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_eval_sweep.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_eval_traversal.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_invocation_artifacts.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skill_policy.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skills.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skills_dir_agent_home_link.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skillsbench_conversion_conformance.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_skillsbench_harbor_run_suite.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_smoke.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_smoke_wiring.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_source_adapters.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_subscription_auth.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_check_eval_consistency.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_digest.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_document.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_download.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_export.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_output_format.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_package.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_task_runtime_primitive.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_tasks.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_token_usage_normalization.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trace_import_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trace_task_gen_traversal.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_traces_huggingface.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_traces_parsers.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_traces_task_gen.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_train_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_train_mode_artifact_emission.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_train_trl_cli.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trajectory_integration.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trajectory_streaming.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trial_agent_timeout_verify.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trial_install_agent_timeout.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trial_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_trl_integration.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_usage_litellm.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_usage_required.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_usage_tracking.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_user.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_v06_guard_ports.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_document.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_multi_container.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_output.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_output_freshness.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_strategies.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verifier_wedge_retry.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_verify.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_workflow_action_pinning.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/test_yaml_config.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/__init__.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export_adp.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export_atif.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export_common.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export_nan_handling.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_export_prime_sft.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_redaction.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_step_granularity.py +0 -0
- {benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/tests/trajectories/test_tree.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: benchflow
|
|
3
|
-
Version: 0.6.7.
|
|
3
|
+
Version: 0.6.7.dev1845
|
|
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
|
|
@@ -18,10 +18,13 @@ from typing import Any, NamedTuple
|
|
|
18
18
|
class SessionCounters(NamedTuple):
|
|
19
19
|
"""The live ACP session counters the console heartbeat logs.
|
|
20
20
|
|
|
21
|
-
``total_tokens`` is None until
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
``total_tokens`` is None until a live usage signal exists: the producer
|
|
22
|
+
(``Rollout.activity_snapshot``) fills it with max(ACP prompt-completion
|
|
23
|
+
snapshot, LiteLLM gateway live-capture total), so it becomes non-None as
|
|
24
|
+
soon as the gateway has mirrored a usage-bearing record — mid-prompt —
|
|
25
|
+
even when no ACP prompt has completed yet. ``distinct_tools`` counts
|
|
26
|
+
distinct tool display titles seen this session; None means unknown, which
|
|
27
|
+
renderers treat like varied (keep the ``last:`` cell).
|
|
25
28
|
"""
|
|
26
29
|
|
|
27
30
|
tool_calls: int
|
|
@@ -4,27 +4,32 @@ The one file-touching corner of the CLI's final report block: when a failed
|
|
|
4
4
|
task's reason would otherwise be the bare ``reward X`` fallback, mine the
|
|
5
5
|
rollout's verifier artifacts for a one-line explanation. Lives in its own
|
|
6
6
|
module so ``cli/_shared.py`` stays the side-effect-free display helpers it
|
|
7
|
-
advertises.
|
|
7
|
+
advertises. Also home of :func:`metric_breakdown`, the one canonical
|
|
8
|
+
rewards-dict flattening — shared by ``_shared.py``'s in-memory metric tier and
|
|
9
|
+
the ``reward.json`` probe here, so the two render identically.
|
|
8
10
|
|
|
9
11
|
Contract (the engine stays file-free — these reads are CLI-side, report-time
|
|
10
12
|
only):
|
|
11
13
|
|
|
12
14
|
- The rollout dir is resolved exactly, from the ``rollout_name`` the engine
|
|
13
15
|
records on every result — never guessed from globs.
|
|
14
|
-
- Evidence sources are tried in order (CTRF report, then
|
|
15
|
-
the first that yields a line wins.
|
|
16
|
+
- Evidence sources are tried in order (CTRF report, then reward.json metric
|
|
17
|
+
breakdown, then test-stdout tail); the first that yields a line wins.
|
|
16
18
|
- Every read is bounded (``_ARTIFACT_READ_BYTES`` per file) and nothing here
|
|
17
19
|
raises — any surprise degrades to ``None``, i.e. the bare reward reason.
|
|
20
|
+
- The report block's ``(details: …)`` pointer is decided separately, by
|
|
21
|
+
:func:`verifier_dir_for` from dir existence alone — every failure block
|
|
22
|
+
with artifacts on disk gets one pointer, evidence or not.
|
|
18
23
|
"""
|
|
19
24
|
|
|
20
25
|
from __future__ import annotations
|
|
21
26
|
|
|
22
27
|
import json
|
|
23
28
|
import re
|
|
24
|
-
from typing import TYPE_CHECKING, NamedTuple
|
|
29
|
+
from typing import TYPE_CHECKING, Any, NamedTuple
|
|
25
30
|
|
|
26
31
|
if TYPE_CHECKING:
|
|
27
|
-
from collections.abc import Callable
|
|
32
|
+
from collections.abc import Callable, Mapping
|
|
28
33
|
from pathlib import Path
|
|
29
34
|
|
|
30
35
|
# Never read more than this many bytes per file, and evidence is only mined
|
|
@@ -32,6 +37,8 @@ if TYPE_CHECKING:
|
|
|
32
37
|
_ARTIFACT_READ_BYTES = 64 * 1024
|
|
33
38
|
# Pytest final summary, decoration stripped: "1 failed, 2 passed in 40.86s".
|
|
34
39
|
_PYTEST_SUMMARY_RE = re.compile(r"\d+ failed\b")
|
|
40
|
+
# Metric-breakdown cap: one metric-happy verifier can't flood the line.
|
|
41
|
+
_BREAKDOWN_METRICS = 3
|
|
35
42
|
|
|
36
43
|
|
|
37
44
|
class FailureLine(NamedTuple):
|
|
@@ -49,6 +56,88 @@ class FailureLine(NamedTuple):
|
|
|
49
56
|
suffix: str = ""
|
|
50
57
|
|
|
51
58
|
|
|
59
|
+
def _numeric_items(mapping: Mapping[str, Any]) -> list[tuple[str, Any]]:
|
|
60
|
+
"""The named numeric metrics of one mapping level, insertion-ordered.
|
|
61
|
+
|
|
62
|
+
``reward`` is excluded at every level: at the top it is the aggregate the
|
|
63
|
+
line already leads with, and a nested ``reward`` would render a confusing
|
|
64
|
+
``reward 0.8 — reward 0.8``.
|
|
65
|
+
"""
|
|
66
|
+
return [
|
|
67
|
+
(name, value)
|
|
68
|
+
for name, value in mapping.items()
|
|
69
|
+
if name != "reward" and isinstance(value, (bool, int, float))
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def metric_breakdown(rewards: Mapping[str, Any]) -> str | None:
|
|
74
|
+
"""Compact ``name value`` metric breakdown of a rewards mapping, capped at
|
|
75
|
+
``_BREAKDOWN_METRICS`` — or ``None`` when it holds no named metrics.
|
|
76
|
+
|
|
77
|
+
The numeric evidence may sit flat in the mapping, or nested one level under
|
|
78
|
+
a ``metrics`` sub-dict (env0-style verifiers: ``{"reward": …, "metrics":
|
|
79
|
+
{…}, "details": {…}}``), or under ``details`` when ``metrics`` yields
|
|
80
|
+
nothing. Flat keys win outright — a flat rewards dict renders exactly as
|
|
81
|
+
before.
|
|
82
|
+
|
|
83
|
+
Ordering leads with the lowest-signal metrics — they explain the miss:
|
|
84
|
+
|
|
85
|
+
- A ``<name>_found`` metric with a matching positive numeric
|
|
86
|
+
``<name>_total`` anywhere in the mapping renders as ``<name> found/total``
|
|
87
|
+
and sorts by that fraction, so ``deadlines 1/5`` leads even though 1 is
|
|
88
|
+
not 0. A total consumed by a pair is dropped from the shown list (the
|
|
89
|
+
fraction already carries it).
|
|
90
|
+
- Unpaired metrics keep the zero-first rule: zero/failed first, stable
|
|
91
|
+
within each group.
|
|
92
|
+
"""
|
|
93
|
+
shown = _numeric_items(rewards)
|
|
94
|
+
if not shown:
|
|
95
|
+
for key in ("metrics", "details"):
|
|
96
|
+
sub = rewards.get(key)
|
|
97
|
+
if isinstance(sub, dict):
|
|
98
|
+
shown = _numeric_items(sub)
|
|
99
|
+
if shown:
|
|
100
|
+
break
|
|
101
|
+
if not shown:
|
|
102
|
+
return None
|
|
103
|
+
# found/total pairing looks across ALL levels: env0 keeps the found counts
|
|
104
|
+
# under "metrics" and the totals under "details". First-seen wins.
|
|
105
|
+
totals: dict[str, Any] = {}
|
|
106
|
+
for source in (rewards, rewards.get("metrics"), rewards.get("details")):
|
|
107
|
+
if isinstance(source, dict):
|
|
108
|
+
for name, value in _numeric_items(source):
|
|
109
|
+
totals.setdefault(name, value)
|
|
110
|
+
|
|
111
|
+
def _pair_total(name: str, value: Any) -> Any | None:
|
|
112
|
+
"""The positive numeric ``<base>_total`` for a ``<base>_found`` metric,
|
|
113
|
+
else ``None``. Bools (either side) and non-positive totals never pair."""
|
|
114
|
+
base = name.removesuffix("_found")
|
|
115
|
+
if base == name or isinstance(value, bool):
|
|
116
|
+
return None
|
|
117
|
+
total = totals.get(base + "_total")
|
|
118
|
+
if isinstance(total, bool) or not isinstance(total, (int, float)):
|
|
119
|
+
return None
|
|
120
|
+
return total if total > 0 else None
|
|
121
|
+
|
|
122
|
+
consumed = {
|
|
123
|
+
name.removesuffix("_found") + "_total"
|
|
124
|
+
for name, value in shown
|
|
125
|
+
if _pair_total(name, value) is not None
|
|
126
|
+
}
|
|
127
|
+
entries: list[tuple[float, str]] = []
|
|
128
|
+
for name, value in shown:
|
|
129
|
+
if name in consumed:
|
|
130
|
+
continue
|
|
131
|
+
total = _pair_total(name, value)
|
|
132
|
+
if total is not None:
|
|
133
|
+
base = name.removesuffix("_found")
|
|
134
|
+
entries.append((value / total, f"{base} {value}/{total}"))
|
|
135
|
+
else:
|
|
136
|
+
entries.append((0.0 if value == 0 else 1.0, f"{name} {value}"))
|
|
137
|
+
entries.sort(key=lambda entry: entry[0]) # stable: ties keep dict order
|
|
138
|
+
return ", ".join(fragment for _, fragment in entries[:_BREAKDOWN_METRICS])
|
|
139
|
+
|
|
140
|
+
|
|
52
141
|
def _display_test_name(raw_name: str) -> str:
|
|
53
142
|
"""Test name for display: node-id path segments dropped, param id kept.
|
|
54
143
|
|
|
@@ -65,6 +154,19 @@ def _display_test_name(raw_name: str) -> str:
|
|
|
65
154
|
return head.rsplit("::", 1)[-1] + bracket + param
|
|
66
155
|
|
|
67
156
|
|
|
157
|
+
def _bounded_json(path: Path) -> dict[str, Any] | None:
|
|
158
|
+
"""The file parsed as a JSON object, or ``None`` when it can't serve.
|
|
159
|
+
|
|
160
|
+
JSON only parses whole — an oversized (> ``_ARTIFACT_READ_BYTES``) file is
|
|
161
|
+
skipped, not truncated, and a non-object payload is skipped the same way;
|
|
162
|
+
either way the next evidence source gets its turn.
|
|
163
|
+
"""
|
|
164
|
+
if path.stat().st_size > _ARTIFACT_READ_BYTES:
|
|
165
|
+
return None
|
|
166
|
+
data = json.loads(path.read_text(encoding="utf-8", errors="replace"))
|
|
167
|
+
return data if isinstance(data, dict) else None
|
|
168
|
+
|
|
169
|
+
|
|
68
170
|
def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
|
|
69
171
|
"""``<test> failed[: <assertion>]`` from the first failed CTRF test.
|
|
70
172
|
|
|
@@ -76,11 +178,9 @@ def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
|
|
|
76
178
|
carries a count suffix (``(+N more failures; P/T checks passed)``) so the
|
|
77
179
|
console never under-reports how much is broken.
|
|
78
180
|
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
# truncated) and the next evidence source gets its turn.
|
|
181
|
+
data = _bounded_json(ctrf_path)
|
|
182
|
+
if data is None:
|
|
82
183
|
return None
|
|
83
|
-
data = json.loads(ctrf_path.read_text(encoding="utf-8", errors="replace"))
|
|
84
184
|
raw_tests = (data.get("results") or {}).get("tests") or []
|
|
85
185
|
tests = [test for test in raw_tests if isinstance(test, dict)]
|
|
86
186
|
failed = [test for test in tests if test.get("status") == "failed"]
|
|
@@ -115,6 +215,25 @@ def _ctrf_failure_line(ctrf_path: Path) -> FailureLine | None:
|
|
|
115
215
|
return FailureLine(f"{name} failed", suffix)
|
|
116
216
|
|
|
117
217
|
|
|
218
|
+
def _reward_json_failure_line(reward_path: Path) -> FailureLine | None:
|
|
219
|
+
"""Metric breakdown mined from the verifier's ``reward.json``.
|
|
220
|
+
|
|
221
|
+
env0-style verifiers write ``{"reward": …, "metrics": {…}, "details":
|
|
222
|
+
{…}}`` (and non-pytest stdout, no CTRF report) — when the result's rewards
|
|
223
|
+
dict was stripped to the bare aggregate (older persisted results, sharded
|
|
224
|
+
aggregation), the numeric evidence still sits on disk. Reuses the same
|
|
225
|
+
one-level flattening as the in-memory reward-dict tier so the two render
|
|
226
|
+
identically. A file with no named metrics repeats nothing the line does
|
|
227
|
+
not already say — it yields to the stdout tail. No count suffix: the
|
|
228
|
+
breakdown is a metric summary, not a first-of-N failure pick.
|
|
229
|
+
"""
|
|
230
|
+
data = _bounded_json(reward_path)
|
|
231
|
+
if data is None:
|
|
232
|
+
return None
|
|
233
|
+
shown = metric_breakdown(data)
|
|
234
|
+
return FailureLine(shown) if shown is not None else None
|
|
235
|
+
|
|
236
|
+
|
|
118
237
|
def _stdout_tail_failure_line(stdout_path: Path) -> FailureLine | None:
|
|
119
238
|
"""Last pytest summary ("N failed, M passed …") — else last ``FAILED …``
|
|
120
239
|
line — from a bounded tail of the verifier's test-stdout capture. No count
|
|
@@ -133,13 +252,28 @@ def _stdout_tail_failure_line(stdout_path: Path) -> FailureLine | None:
|
|
|
133
252
|
return FailureLine(last_failed) if last_failed is not None else None
|
|
134
253
|
|
|
135
254
|
|
|
136
|
-
def
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
255
|
+
def verifier_dir_for(job_dir: Path, rollout_name: str) -> Path | None:
|
|
256
|
+
"""The rollout's verifier dir when it exists on disk, else ``None``.
|
|
257
|
+
|
|
258
|
+
Powers the report block's ``(details: …)`` pointer rule: every failure
|
|
259
|
+
block with artifacts on disk gets one pointer — from dir existence alone,
|
|
260
|
+
independent of which tier supplied the reason line (the pointer is most
|
|
261
|
+
valuable exactly when evidence extraction fails). Never raises.
|
|
262
|
+
"""
|
|
263
|
+
# Local import: RolloutPaths pulls in the task package (see
|
|
264
|
+
# artifact_failure_evidence).
|
|
265
|
+
from benchflow.task.paths import RolloutPaths
|
|
266
|
+
|
|
267
|
+
try:
|
|
268
|
+
verifier_dir = RolloutPaths(rollout_dir=job_dir / rollout_name).verifier_dir
|
|
269
|
+
return verifier_dir if verifier_dir.is_dir() else None
|
|
270
|
+
except Exception:
|
|
271
|
+
return None
|
|
272
|
+
|
|
140
273
|
|
|
141
|
-
|
|
142
|
-
the
|
|
274
|
+
def artifact_failure_evidence(job_dir: Path, rollout_name: str) -> FailureLine | None:
|
|
275
|
+
"""``FailureLine`` mined from the rollout's verifier artifacts, or ``None``
|
|
276
|
+
when every probe misses. Never raises.
|
|
143
277
|
"""
|
|
144
278
|
# Local import: RolloutPaths pulls in the task package, which the CLI
|
|
145
279
|
# shouldn't pay for until a failure actually needs artifact evidence.
|
|
@@ -151,6 +285,7 @@ def artifact_failure_evidence(
|
|
|
151
285
|
# ctrf.json has no RolloutPaths property — the verifier recovers it by
|
|
152
286
|
# literal name (verifier_core.py, `_recover_main_verifier_outputs`).
|
|
153
287
|
(verifier_dir / "ctrf.json", _ctrf_failure_line),
|
|
288
|
+
(rollout_paths.reward_json_path, _reward_json_failure_line),
|
|
154
289
|
(rollout_paths.test_stdout_path, _stdout_tail_failure_line),
|
|
155
290
|
]
|
|
156
291
|
for path, extract in attempts:
|
|
@@ -163,5 +298,5 @@ def artifact_failure_evidence(
|
|
|
163
298
|
# the report must never crash over evidence mining.
|
|
164
299
|
continue
|
|
165
300
|
if detail is not None:
|
|
166
|
-
return detail
|
|
301
|
+
return detail
|
|
167
302
|
return None
|
|
@@ -162,9 +162,12 @@ def _activity_cell(snap: live_activity.ActivitySnapshot | None) -> str:
|
|
|
162
162
|
which the Live display otherwise mutes. Until the agent session exists
|
|
163
163
|
(and after it is closed for the verifier) the cell shows the rollout's
|
|
164
164
|
lifecycle phase as a label instead, and a registry miss (None) shows the
|
|
165
|
-
fallback label, so the row is never blank. Tokens appear
|
|
166
|
-
|
|
167
|
-
|
|
165
|
+
fallback label, so the row is never blank. Tokens appear as soon as
|
|
166
|
+
either live signal exists — the gateway's live callback capture (per
|
|
167
|
+
completed LLM request, i.e. mid-prompt) or the ACP usage snapshot (per
|
|
168
|
+
completed prompt); ``Rollout.activity_snapshot`` reconciles the two as
|
|
169
|
+
max(). Once tokens are present, a single-tool agent's cell is
|
|
170
|
+
``38 calls · 412.0k tok`` (no ``last:``).
|
|
168
171
|
"""
|
|
169
172
|
if snap is None:
|
|
170
173
|
return _PHASE_FALLBACK
|
|
@@ -379,12 +382,19 @@ class LiveEvalProgress:
|
|
|
379
382
|
parts.append(tbl)
|
|
380
383
|
|
|
381
384
|
# Footer: pass-rate (excl errors) + token/cost economics. Tokens sum
|
|
382
|
-
# the completed tasks' trusted telemetry PLUS the running
|
|
383
|
-
# live
|
|
384
|
-
#
|
|
385
|
-
#
|
|
386
|
-
#
|
|
387
|
-
#
|
|
385
|
+
# the completed tasks' trusted telemetry PLUS the running rollouts'
|
|
386
|
+
# live usage — per running task, max(ACP prompt-completion snapshot,
|
|
387
|
+
# gateway live-capture total): the gateway side steps forward per
|
|
388
|
+
# completed LLM *request*, so a single-prompt agent phase shows its
|
|
389
|
+
# spend while the prompt runs, not only at scoring (the ACP side
|
|
390
|
+
# alone stays empty until the prompt completes). Reconciliation
|
|
391
|
+
# (documented at Rollout.activity_snapshot): max() keeps the running
|
|
392
|
+
# figure monotonic whichever signal leads, and degrades to the
|
|
393
|
+
# ACP-only value when the gateway capture is unavailable. The total
|
|
394
|
+
# is still NOT monotonic across a task's completion boundary: scoring
|
|
395
|
+
# swaps the live figure for the trusted gateway import (which can be
|
|
396
|
+
# lower than either live signal — untracked discards, cache
|
|
397
|
+
# accounting, ACP over-report), and a task completing with
|
|
388
398
|
# untrusted/absent telemetry drops its live contribution entirely —
|
|
389
399
|
# a sole-task footer can collapse back to "— tokens". Clamping would
|
|
390
400
|
# falsify the trusted sum, so the dip is intended. Show "—" (not 0 /
|
|
@@ -21,7 +21,12 @@ from rich.console import Console
|
|
|
21
21
|
from rich.markup import escape
|
|
22
22
|
|
|
23
23
|
from benchflow._utils.text import truncate_end
|
|
24
|
-
from benchflow.cli._failure_evidence import
|
|
24
|
+
from benchflow.cli._failure_evidence import (
|
|
25
|
+
FailureLine,
|
|
26
|
+
artifact_failure_evidence,
|
|
27
|
+
metric_breakdown,
|
|
28
|
+
verifier_dir_for,
|
|
29
|
+
)
|
|
25
30
|
|
|
26
31
|
if TYPE_CHECKING:
|
|
27
32
|
from pathlib import Path
|
|
@@ -110,55 +115,38 @@ def _exit_if_evaluation_had_errors(result: object) -> None:
|
|
|
110
115
|
# count suffix, which deliberately run ~40 chars past the budget.
|
|
111
116
|
_MAX_FAILURE_LINES = 5
|
|
112
117
|
_FAILURE_LINE_LIMIT = 100
|
|
113
|
-
_FAILURE_REASON_METRICS = 3
|
|
114
118
|
|
|
115
119
|
|
|
116
|
-
def _failure_reason(
|
|
117
|
-
|
|
118
|
-
) -> tuple[FailureLine, Path | None]:
|
|
119
|
-
"""One cheap line explaining why a FAILED (scored, reward != 1) task
|
|
120
|
-
failed, plus the verifier dir when artifacts supplied the evidence.
|
|
120
|
+
def _failure_reason(failure: TaskFailure, job_dir: Path | None = None) -> FailureLine:
|
|
121
|
+
"""One cheap line explaining why a FAILED (scored, reward != 1) task failed.
|
|
121
122
|
|
|
122
123
|
Priority: the verifier's own error if set; else the reward plus a compact
|
|
123
|
-
breakdown of the named metrics in the reward dict
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
``(details: …)`` pointer
|
|
124
|
+
breakdown of the named metrics in the reward dict — flat, or flattened one
|
|
125
|
+
level from an env0-style ``metrics``/``details`` sub-dict, lowest-signal
|
|
126
|
+
metrics first (see :func:`metric_breakdown`); else the reward plus a
|
|
127
|
+
one-liner mined from the rollout's verifier artifacts (bounded CLI-side
|
|
128
|
+
reads resolved via the ``rollout_name`` the engine records — the engine
|
|
129
|
+
stays file-free); else just the reward. The reason is a ``FailureLine`` so
|
|
130
|
+
the artifact tier's multi-failure count suffix stays separable from the
|
|
131
|
+
truncatable body (only the artifact tier ever sets it). The block's
|
|
132
|
+
``(details: …)`` pointer is NOT decided here — the caller keys it off
|
|
133
|
+
on-disk artifacts alone, independent of which tier supplied the reason.
|
|
132
134
|
"""
|
|
133
135
|
if failure.verifier_error:
|
|
134
136
|
# Collapse whitespace: verifier errors are routinely multi-line.
|
|
135
|
-
return FailureLine(" ".join(failure.verifier_error.split()))
|
|
137
|
+
return FailureLine(" ".join(failure.verifier_error.split()))
|
|
136
138
|
rewards = failure.rewards or {}
|
|
137
139
|
reward = rewards.get("reward")
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if name != "reward" and isinstance(value, (bool, int, float))
|
|
142
|
-
]
|
|
143
|
-
if metrics:
|
|
144
|
-
# Zero/failed metrics first (stable within each group), capped so one
|
|
145
|
-
# metric-happy verifier can't flood the line.
|
|
146
|
-
metrics.sort(key=lambda kv: kv[1] != 0)
|
|
147
|
-
shown = ", ".join(
|
|
148
|
-
f"{name} {value}" for name, value in metrics[:_FAILURE_REASON_METRICS]
|
|
149
|
-
)
|
|
150
|
-
return FailureLine(f"reward {reward} — {shown}"), None
|
|
140
|
+
shown = metric_breakdown(rewards)
|
|
141
|
+
if shown is not None:
|
|
142
|
+
return FailureLine(f"reward {reward} — {shown}")
|
|
151
143
|
# No rollout_name (pre-#957-follow-up result.json, sharded aggregation):
|
|
152
144
|
# nothing to resolve — the bare reward is as honest as it gets.
|
|
153
145
|
if job_dir is not None and failure.rollout_name:
|
|
154
|
-
|
|
155
|
-
if
|
|
156
|
-
detail,
|
|
157
|
-
|
|
158
|
-
FailureLine(f"reward {reward} — {detail.body}", detail.suffix),
|
|
159
|
-
verifier_dir,
|
|
160
|
-
)
|
|
161
|
-
return FailureLine(f"reward {reward}"), None
|
|
146
|
+
detail = artifact_failure_evidence(job_dir, failure.rollout_name)
|
|
147
|
+
if detail is not None:
|
|
148
|
+
return FailureLine(f"reward {reward} — {detail.body}", detail.suffix)
|
|
149
|
+
return FailureLine(f"reward {reward}")
|
|
162
150
|
|
|
163
151
|
|
|
164
152
|
def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -> None:
|
|
@@ -170,8 +158,9 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
|
|
|
170
158
|
dim ``✗ task: reason`` line (capped at ``_MAX_FAILURE_LINES``) so the "why"
|
|
171
159
|
doesn't require opening summary.json; when ``job_dir`` is given, a reason
|
|
172
160
|
that would otherwise be a bare ``reward X`` is upgraded from the rollout's
|
|
173
|
-
verifier artifacts (bounded reads, displayed failures only),
|
|
174
|
-
|
|
161
|
+
verifier artifacts (bounded reads, displayed failures only), and every
|
|
162
|
+
failure block with artifacts on disk gets one ``(details: …/verifier)``
|
|
163
|
+
pointer line — evidence mined or not. When ``job_dir`` is
|
|
175
164
|
given, the result/summary paths are printed so testers know where to look
|
|
176
165
|
(the guide repeatedly says "read summary.json" but the CLI never said
|
|
177
166
|
where).
|
|
@@ -210,9 +199,14 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
|
|
|
210
199
|
failures = getattr(result, "task_failures", None) or []
|
|
211
200
|
artifact_pointer: Path | None = None
|
|
212
201
|
for failure in failures[:_MAX_FAILURE_LINES]:
|
|
213
|
-
reason
|
|
214
|
-
|
|
215
|
-
|
|
202
|
+
reason = _failure_reason(failure, job_dir)
|
|
203
|
+
# Pointer rule: every failure block with artifacts on disk gets one
|
|
204
|
+
# (details:) pointer — the first displayed failure whose verifier dir
|
|
205
|
+
# exists, independent of which tier supplied its reason line (byte-
|
|
206
|
+
# identical reasons must not differ on provenance the console can't
|
|
207
|
+
# show, and the pointer matters most when every probe missed).
|
|
208
|
+
if artifact_pointer is None and job_dir is not None and failure.rollout_name:
|
|
209
|
+
artifact_pointer = verifier_dir_for(job_dir, failure.rollout_name)
|
|
216
210
|
# The char budget governs only the free-text body; the multi-failure
|
|
217
211
|
# count suffix is appended AFTER truncation so a long assertion can
|
|
218
212
|
# never swallow the "more than this is broken" signal. Worst case the
|
|
@@ -226,8 +220,9 @@ def _report_eval_result(result: EvaluationResult, job_dir: Path | None = None) -
|
|
|
226
220
|
extra = len(failures) - _MAX_FAILURE_LINES
|
|
227
221
|
if extra > 0:
|
|
228
222
|
console.print(f"[dim] … and {extra} more[/dim]")
|
|
229
|
-
# One pointer per block (not per line): the first
|
|
230
|
-
# verifier dir
|
|
223
|
+
# One pointer per block (not per line): the first displayed failure whose
|
|
224
|
+
# verifier dir exists — artifact-backed or not — so "where do I look next"
|
|
225
|
+
# needs no summary.json dig even when evidence mining came up empty.
|
|
231
226
|
if artifact_pointer is not None:
|
|
232
227
|
console.print(f"[dim] (details: {escape(str(artifact_pointer))})[/dim]")
|
|
233
228
|
if job_dir is not None:
|
|
@@ -13,6 +13,22 @@ from typing import Any, Protocol, runtime_checkable
|
|
|
13
13
|
from benchflow.environment.manifest import EnvironmentManifest
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
class LiveUsageGateway(Protocol):
|
|
17
|
+
"""A provider gateway process that reports live cumulative token usage.
|
|
18
|
+
|
|
19
|
+
The eval dashboard's mid-prompt token signal reads this accessor through
|
|
20
|
+
the rollout kernel (``Rollout.activity_snapshot`` →
|
|
21
|
+
``_gateway_live_tokens``), which cannot import the concrete provider
|
|
22
|
+
plane — so the NAME is agreed here, at the contract boundary.
|
|
23
|
+
``LiteLLMProcess`` asserts static conformance in
|
|
24
|
+
``benchflow.providers.litellm_runtime``; renaming the accessor on either
|
|
25
|
+
side fails the type checker there instead of silently blanking the
|
|
26
|
+
dashboard signal.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def live_usage_tokens(self) -> int | None: ...
|
|
30
|
+
|
|
31
|
+
|
|
16
32
|
@runtime_checkable
|
|
17
33
|
class RolloutPlanes(Protocol):
|
|
18
34
|
"""Concrete-plane operations the rollout kernel needs."""
|
{benchflow-0.6.7.dev1841 → benchflow-0.6.7.dev1845}/src/benchflow/providers/litellm_runtime.py
RENAMED
|
@@ -19,7 +19,7 @@ import tempfile
|
|
|
19
19
|
from collections.abc import Awaitable, Callable, Mapping
|
|
20
20
|
from dataclasses import dataclass
|
|
21
21
|
from pathlib import Path
|
|
22
|
-
from typing import Any, NoReturn, cast
|
|
22
|
+
from typing import TYPE_CHECKING, Any, NoReturn, cast
|
|
23
23
|
from uuid import uuid4
|
|
24
24
|
|
|
25
25
|
import httpx
|
|
@@ -54,6 +54,9 @@ from benchflow.trajectories._llm_capture import LiveLLMTrajectoryWriter
|
|
|
54
54
|
from benchflow.trajectories.types import Trajectory
|
|
55
55
|
from benchflow.usage_tracking import UsageTrackingConfig, usage_unavailable
|
|
56
56
|
|
|
57
|
+
if TYPE_CHECKING:
|
|
58
|
+
from benchflow.contracts.planes import LiveUsageGateway
|
|
59
|
+
|
|
57
60
|
logger = logging.getLogger(__name__)
|
|
58
61
|
|
|
59
62
|
LITELLM_VERSION_SPEC = "litellm[proxy]==1.89.0"
|
|
@@ -99,6 +102,10 @@ class LiteLLMProcess:
|
|
|
99
102
|
trajectory: Trajectory | None
|
|
100
103
|
session_id: str
|
|
101
104
|
agent_name: str
|
|
105
|
+
# Live-capture token counter (class-level defaults so reads are plain
|
|
106
|
+
# attribute access even before start_live_capture ever runs).
|
|
107
|
+
_live_usage_total_tokens: int = 0
|
|
108
|
+
_live_usage_seen: bool = False
|
|
102
109
|
|
|
103
110
|
@property
|
|
104
111
|
def base_url(self) -> str:
|
|
@@ -126,8 +133,30 @@ class LiteLLMProcess:
|
|
|
126
133
|
)
|
|
127
134
|
self._live_callback_offset = 0
|
|
128
135
|
self._live_callback_remainder = b""
|
|
136
|
+
# Clear ``seen`` BEFORE the total so a racing render-thread read can
|
|
137
|
+
# only observe None (fresh capture) — never a transient "0 tokens".
|
|
138
|
+
self._live_usage_seen = False
|
|
139
|
+
self._live_usage_total_tokens = 0
|
|
129
140
|
self._live_capture_task = asyncio.create_task(self._live_capture_loop())
|
|
130
141
|
|
|
142
|
+
def live_usage_tokens(self) -> int | None:
|
|
143
|
+
"""Cumulative provider tokens the live callback capture has mirrored.
|
|
144
|
+
|
|
145
|
+
Read-only, O(1) — safe to call from the dashboard's render thread while
|
|
146
|
+
the capture loop appends on the event loop (two monotonic attribute
|
|
147
|
+
reads; a torn read is at worst one record stale). None until a
|
|
148
|
+
usage-bearing gateway record has been parsed, so callers can tell "no
|
|
149
|
+
signal yet" from a genuine zero. The value updates per completed LLM
|
|
150
|
+
*request* — mid-prompt — which is exactly the granularity the ACP
|
|
151
|
+
per-completed-prompt snapshots lack (a single-prompt rollout otherwise
|
|
152
|
+
shows no tokens until scoring). It may lag the gateway log by the
|
|
153
|
+
capture cadence/backlog and is display-only: trusted usage still comes
|
|
154
|
+
from the full log import at ``stop()``.
|
|
155
|
+
"""
|
|
156
|
+
if not self._live_usage_seen:
|
|
157
|
+
return None
|
|
158
|
+
return self._live_usage_total_tokens
|
|
159
|
+
|
|
131
160
|
async def _read_callback_chunk(self, offset: int, limit: int) -> bytes:
|
|
132
161
|
raise NotImplementedError
|
|
133
162
|
|
|
@@ -157,6 +186,19 @@ class LiteLLMProcess:
|
|
|
157
186
|
)
|
|
158
187
|
if parsed.exchanges:
|
|
159
188
|
trajectory.exchanges.extend(parsed.exchanges)
|
|
189
|
+
# Live token counter for the eval dashboard: accumulate the
|
|
190
|
+
# same canonical per-exchange accounting scoring sums at
|
|
191
|
+
# stop() (Trajectory.total_provider_tokens over the same
|
|
192
|
+
# parser's output), so the live figure converges to the
|
|
193
|
+
# trusted total as the capture catches up. Failure records
|
|
194
|
+
# carry no usage and leave the counter untouched.
|
|
195
|
+
if parsed.has_provider_usage:
|
|
196
|
+
# Total before ``seen``: a racing reader can never
|
|
197
|
+
# observe seen=True with a not-yet-updated total.
|
|
198
|
+
self._live_usage_total_tokens += int(
|
|
199
|
+
parsed.total_provider_tokens
|
|
200
|
+
)
|
|
201
|
+
self._live_usage_seen = True
|
|
160
202
|
changed = True
|
|
161
203
|
if len(chunk) < _LIVE_CAPTURE_CHUNK_BYTES:
|
|
162
204
|
break
|
|
@@ -189,6 +231,19 @@ class LiteLLMProcess:
|
|
|
189
231
|
writer.reconcile(self.trajectory)
|
|
190
232
|
|
|
191
233
|
|
|
234
|
+
def _live_usage_gateway_conformance(process: LiteLLMProcess) -> LiveUsageGateway:
|
|
235
|
+
"""Static assertion: LiteLLMProcess satisfies the contract the rollout
|
|
236
|
+
kernel's dashboard read binds to (``contracts.planes.LiveUsageGateway``).
|
|
237
|
+
|
|
238
|
+
The kernel cannot import this module (#515 architecture invariant), so
|
|
239
|
+
its ``server.live_usage_tokens()`` call is dynamically typed there; this
|
|
240
|
+
return-type check is what makes a rename of the accessor — on either the
|
|
241
|
+
protocol or the process side — fail ``ty`` instead of silently blanking
|
|
242
|
+
the live token signal. Never called at runtime.
|
|
243
|
+
"""
|
|
244
|
+
return process
|
|
245
|
+
|
|
246
|
+
|
|
192
247
|
class HostLiteLLMProcess(LiteLLMProcess):
|
|
193
248
|
def __init__(
|
|
194
249
|
self,
|
|
@@ -9,10 +9,13 @@ from __future__ import annotations
|
|
|
9
9
|
|
|
10
10
|
from dataclasses import dataclass
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Any
|
|
12
|
+
from typing import TYPE_CHECKING, Any
|
|
13
13
|
|
|
14
14
|
from benchflow.usage_tracking import UsageTrackingConfig
|
|
15
15
|
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from benchflow.providers.litellm_runtime import LiteLLMProcess
|
|
18
|
+
|
|
16
19
|
|
|
17
20
|
@dataclass
|
|
18
21
|
class ProviderRuntime:
|
|
@@ -21,7 +24,11 @@ class ProviderRuntime:
|
|
|
21
24
|
kind: str
|
|
22
25
|
agent_base_url: str
|
|
23
26
|
backend_model: str | None = None
|
|
24
|
-
|
|
27
|
+
# Typed (not Any) so cross-module reads of the server's accessors —
|
|
28
|
+
# e.g. the dashboard's live_usage_tokens dig in rollout — are bound by
|
|
29
|
+
# the type checker: a rename on LiteLLMProcess breaks ty, not silently
|
|
30
|
+
# blanks a signal behind a getattr default.
|
|
31
|
+
server: LiteLLMProcess | None = None
|
|
25
32
|
config_key: str | None = None
|
|
26
33
|
master_key: str | None = None
|
|
27
34
|
|