benchflow 0.6.7.dev1840__tar.gz → 0.6.7.dev1841__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.dev1840 → benchflow-0.6.7.dev1841}/PKG-INFO +1 -1
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/pyproject.toml +1 -1
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/live_activity.py +4 -1
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/session.py +55 -9
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_live_progress.py +55 -15
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/__init__.py +6 -2
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_live_progress.py +166 -81
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_console_progress.py +50 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/.gitignore +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/CHANGELOG.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/LICENSE +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/README.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_dotenv.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_paths.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_run.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_types.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/benchmark_repos.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/build_context_stage.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/config_override.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/content_address.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/dataset_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/env_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/evaluation_results.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/hf_datasets.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/json_safe.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/learner_memory.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/result_metadata.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/reward_events.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/scoring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/source_provenance.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/text.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/_utils/yaml_loader.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/client.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/container_transport.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/selection.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/transport.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/acp/types.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_container.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/_toolathlon_services.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/harbor.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/inbound.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/inspect_ai.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/ors.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/adapters/source.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_guide.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_parity.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agent_router_scaffold.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/codex_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/credentials.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/errors.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/install.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/pi_acp_launcher.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/providers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/agents/remote_manifests.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/branch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_failure_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_hosted_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_options.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/_shared.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/adopt.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/agent.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/continue_cmd.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/environment.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/eval_artifacts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/eval_lift.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/hub.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/main.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/monitor.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/review.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/sandbox.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/tasks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/trace_import.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/cli/train.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/batch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/orchestrator.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/replay_proxy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/run_folder.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/planes.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/contracts/user.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/task.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/demo_task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/diagnostics.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/manifest_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/environment/readiness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/eval_artifacts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/eval_lift.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/eval_plan.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/eval_sharding.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/eval_worker.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/evaluation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/hooks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/hosted_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/hub/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/hub/harbor_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/trl/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/integrations/trl/spec.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/learner_skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/learner_store.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/loop_strategies.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/loop_sweep.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/metrics.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/models.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/monitor.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_logging.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/providers/runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/publish/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/publish/huggingface.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/py.typed +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/default-rubric.json +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/prompts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/runner.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/review/wrapper.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/README.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/builtins.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/events.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/file_readers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/llm.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/memory_scorer.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/node.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/rubric.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/rubric_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rewards/validation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_deadline.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_results.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_setup.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_usage.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/_user_loop.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/session_factory_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout/task_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout_branch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/rollout_planes.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_base.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/_sdk_ops.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_builder.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_image.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/apple_container.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_dind.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_pty.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_reaper.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/daytona_strategies.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/docker.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/lockdown.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/metadata.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/modal_impl.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/_base.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/agentcore.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/apple.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/daytona.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/process/docker.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/providers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/services.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/setup.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/snapshot.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sandbox/user.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/scenes.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/sdk.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/self_gen.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/_core.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/gepa_export.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skill_eval/schema.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skill_policy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_normalize.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_parse.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/_document_profiles.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_model.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_report.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/acceptance_live_validation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/discovery.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/document.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/export.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/imports.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/output_format.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/package.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/paths.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/prompts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/runtime_capabilities.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/runtime_view.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/task.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_core.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_document.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_errors.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_judge_inputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_ors_episode.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_reward_kit.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_scan.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/task/verifier_script_strategy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/templates/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/templates/judge.py.tmpl +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/templates/test.sh.tmpl +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/huggingface.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/local.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/models.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/parsers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/traces/task_gen.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/training/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/training/backends/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/training/backends/prime_rl.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/training/run_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_capture.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_export_common.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/_llm_capture.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/call_purpose.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_adp.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_atif.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_prime_sft.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/export_trl_sft.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/metrics.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/results.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/tree.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/types.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/trajectories/viewer.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/src/benchflow/usage_tracking.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/acceptance_live_harness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_dirscan.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_loader.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_parity.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_manifest_wiring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_namespace_shorthand.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_plugin_entry_points.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/agents/test_remote_manifest_autoload.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/README.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/task.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/acp_smoke/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/conformance-results.json +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/proof_multi_agent.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/proof_snapshot.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/run_conformance.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/conftest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/_helpers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/test_batch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/test_orchestrator.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/test_replay_proxy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/continue_run/test_run_folder.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_chibench_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_clawsbench_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_manifest_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/environment/test_readiness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/task.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/hello-world-task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/test_claude.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/test_codex.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/test_codex_custom_provider.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/test_gemini.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/test_openclaw.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/traces/minimal-claude.jsonl +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/README.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/beta-task/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/mock_openai_responses_server.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/_consistency.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/agent_judge.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/check_adapter_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/check_hosted_env_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/check_results.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/check_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/claude-agent-acp.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/codex-acp.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/gemini.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/mimo.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/openclaw.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/opencode.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/openhands.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/configs/pi-acp.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/deepagents_harness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/rubric_checks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/run.sh +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/run_suite.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/scenarios.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/integration/suites/release.yaml +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acceptance_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acceptance_live.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acceptance_live_execution.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp_capability_advertising.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp_mcp_servers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp_model_config_dispatch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp_pinned_protocol_guard.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_acp_setup_failure_propagation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_adapter_scripts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_adapters.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_env_resolution.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_gemini_defaults.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_idle_timeout_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_model_decouple.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_router.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_router_cli_e2e.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_router_scaffold.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_setup.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agent_spec.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agentcore_builder.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agentcore_parallel.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agentcore_reaper.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agentcore_sandbox.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_agentcore_transport.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_api_error_capture.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_apple_container_sandbox.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_bare_model_provider.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_base_install_imports.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_bedrock_thinking.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_benchflow_experiment_review_validator.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_branch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_build_context_stage.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_build_review_pack.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_capture_trajectory.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_clawsbench_slice.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_adopt_aliases.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_arg_validation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_daytona.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_docs_drift.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_edge_case_hardening.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_hub_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_cli_misc.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_codex_review.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_codex_self_write_auth.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_config_override.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_config_redaction.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_connect_as_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_console_error_truncation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_continuallearningbench_adapter.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_dataset_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_command_polling.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_dind_compose_up.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_download.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_poll_deadline.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_daytona_reap.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_deepagents_agent.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_docker_prune_scoping.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_docker_uploads.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_docs_examples.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eng50_capabilities.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_env_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_env_setup.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_environment_manifest_controls.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_artifact_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_filters_applied.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_lift.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_sharding.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_single_task_summary.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_source_provenance.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_worker_retry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_eval_zero_task_guard.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_evaluation_environment_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_exclude_tasks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_filter_credentialed_cells.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_harvey_lab_shim.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_hilbench_adapter.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_hosted_env.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_hosted_env_rollout_contract.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_hub_harbor_registry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_inbound_adapter_manifest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_inbound_adapters.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_agent_judge.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_check_results.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_consistency.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_matrix.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_provider_selection.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_run_suite.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_integration_suite.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_internet_policy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_job.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_job_sequential_shared.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_job_sequential_shared_resume.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_judge_robustness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_judge_symlink_ingestion.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_learner_skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_learner_skills_traversal.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_learner_store.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_learner_store_persistence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_hardening.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_logging.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_model_via_env_generic.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_reasoning_passthrough.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_litellm_smoke.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_live_llm_trajectory.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_llm_judge.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_llm_judge_event_tags.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_llm_judge_verifier.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_loop_strategies.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_loop_summary.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_loop_sweep.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_memory_scorer.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_metrics.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_mle_bench_adapter.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_mock_openai_responses_server.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_monitor_scaffold.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_native_acp_usage.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_no_cross_provider_fallback.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_notification_order_real.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_opencode_family_proxy_tracking.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_oracle.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_oracle_chokepoint.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_paths_safe.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_paths_symlink_helpers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_pi_acp_launcher.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_pi_acp_proxy_routing.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_process.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_project_skills_layout.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_provider_auth_detection.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_providers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_reexport.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_registry_invariants.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_release_hardening_r5.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_release_version.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_release_workflow_wiring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_resolve_env_helpers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_review_boundaries.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_review_rubric.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_review_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_reward_lenient.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_reward_node.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_reward_range.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_reward_unified_contract.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rewards.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rewards_jsonl.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_architecture.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_branch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_config_path_coercion.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_environment.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_hard_deadline.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_import_no_side_effects.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_on_ask_user_wiring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_planes_contract.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_probe_sandbox_health.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_session_factory_dispatch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_setup_commands.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rollout_upload.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rubric_checks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_rubric_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_runtime_capabilities.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_runtime_config_wired.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_runtime_live_sandbox.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_exec_secret_handling.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_hardening.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_live_process.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_multi_service.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_prebuilt_validation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_protocol.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_provider_registry_drift.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_setup.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_snapshot_contract.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_upload_symlink.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sandbox_verifier_workspace.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_scene.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_scene_outbox_trial.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_scene_parallel_group.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_scene_result_aggregation.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_scoring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sdk_internals.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sdk_lockdown.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sdk_run_alias.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_sealed_channel_container.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_self_gen_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_self_gen_export_error_channel.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_self_gen_export_failures.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_self_gen_orchestration.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_session_factory_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_session_request_permission_dispatch.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_eval.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_dryrun.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_integration.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_sweep.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_eval_traversal.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_invocation_artifacts.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skill_policy.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skills.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skills_dir_agent_home_link.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skillsbench_conversion_conformance.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_skillsbench_harbor_run_suite.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_smoke.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_smoke_wiring.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_source_adapters.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_subscription_auth.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_check_eval_consistency.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_digest.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_document.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_download.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_export.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_output_format.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_package.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_task_runtime_primitive.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_tasks.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_token_usage_normalization.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trace_import_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trace_task_gen_traversal.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_traces_huggingface.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_traces_parsers.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_traces_task_gen.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_train_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_train_mode_artifact_emission.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_train_trl_cli.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trajectory_integration.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trajectory_streaming.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trial_agent_timeout_verify.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trial_install_agent_timeout.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trial_litellm_runtime.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_trl_integration.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_usage_litellm.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_usage_required.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_usage_tracking.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_user.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_v06_guard_ports.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_document.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_multi_container.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_output.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_output_freshness.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_strategies.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verifier_wedge_retry.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_verify.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_workflow_action_pinning.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/test_yaml_config.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/__init__.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_adp.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_atif.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_common.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_nan_handling.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_export_prime_sft.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_redaction.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/tests/trajectories/test_step_granularity.py +0 -0
- {benchflow-0.6.7.dev1840 → benchflow-0.6.7.dev1841}/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.dev1841
|
|
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
|
|
@@ -19,12 +19,15 @@ class SessionCounters(NamedTuple):
|
|
|
19
19
|
"""The live ACP session counters the console heartbeat logs.
|
|
20
20
|
|
|
21
21
|
``total_tokens`` is None until the session has a usage snapshot (i.e.
|
|
22
|
-
after a completed prompt).
|
|
22
|
+
after a completed prompt). ``distinct_tools`` counts distinct tool
|
|
23
|
+
display titles seen this session; None means unknown, which renderers
|
|
24
|
+
treat like varied (keep the ``last:`` cell).
|
|
23
25
|
"""
|
|
24
26
|
|
|
25
27
|
tool_calls: int
|
|
26
28
|
last_tool: str
|
|
27
29
|
total_tokens: int | None
|
|
30
|
+
distinct_tools: int | None = None
|
|
28
31
|
|
|
29
32
|
|
|
30
33
|
class ActivitySnapshot(NamedTuple):
|
|
@@ -138,6 +138,17 @@ def _canonical_tool_kind(kind: object, title: object = "") -> str:
|
|
|
138
138
|
return raw_kind
|
|
139
139
|
|
|
140
140
|
|
|
141
|
+
def _tool_display_title(title: str, kind: str) -> str:
|
|
142
|
+
"""A tool call's display title: first line of ``title``, else ``kind``.
|
|
143
|
+
|
|
144
|
+
``split`` not ``splitlines`` so a whitespace-only title strips to ``""``
|
|
145
|
+
instead of raising on an empty line list. Shared by the heartbeat/dashboard
|
|
146
|
+
snapshot and the distinct-title tracker so "distinct" means exactly
|
|
147
|
+
"renders differently".
|
|
148
|
+
"""
|
|
149
|
+
return (title or kind or "").strip().split("\n", 1)[0]
|
|
150
|
+
|
|
151
|
+
|
|
141
152
|
class ToolCallRecord:
|
|
142
153
|
"""Record of a single tool call within a session.
|
|
143
154
|
|
|
@@ -191,6 +202,12 @@ class ACPSession:
|
|
|
191
202
|
self.thought_chunks: list[str] = []
|
|
192
203
|
self.tool_calls: list[ToolCallRecord] = []
|
|
193
204
|
self._tool_call_map: dict[str, ToolCallRecord] = {}
|
|
205
|
+
# Distinct display titles across recorded tool calls, maintained
|
|
206
|
+
# incrementally at record creation so the eval dashboard can detect
|
|
207
|
+
# single-tool agents (prime-agent funnels everything through one
|
|
208
|
+
# IPython tool — a constant "last: IPython cell" carries no
|
|
209
|
+
# information) in O(1) at render time.
|
|
210
|
+
self._seen_tool_titles: set[str] = set()
|
|
194
211
|
self.stop_reason: StopReason | None = None
|
|
195
212
|
self.usage_snapshots: list[ACPUsageSnapshot] = []
|
|
196
213
|
self.created_at = datetime.now()
|
|
@@ -226,15 +243,24 @@ class ACPSession:
|
|
|
226
243
|
counters, also polled by the live eval dashboard's activity cell.
|
|
227
244
|
|
|
228
245
|
The title is the raw first line (untruncated — display width belongs
|
|
229
|
-
to each render site
|
|
230
|
-
title strips to ``""`` instead of raising on an empty line list.
|
|
246
|
+
to each render site; see :func:`_tool_display_title`).
|
|
231
247
|
"""
|
|
232
248
|
title = ""
|
|
233
249
|
if self.tool_calls:
|
|
234
250
|
last = self.tool_calls[-1]
|
|
235
|
-
title = (last.title
|
|
251
|
+
title = _tool_display_title(last.title, last.kind)
|
|
236
252
|
return len(self.tool_calls), title
|
|
237
253
|
|
|
254
|
+
@property
|
|
255
|
+
def distinct_tool_titles(self) -> int:
|
|
256
|
+
"""Count of distinct display titles across recorded tool calls.
|
|
257
|
+
|
|
258
|
+
O(1) read for the eval dashboard: ``1`` with several calls means a
|
|
259
|
+
single-tool agent, whose activity cell drops the constant ``last:``
|
|
260
|
+
suffix in favour of the token count.
|
|
261
|
+
"""
|
|
262
|
+
return len(self._seen_tool_titles)
|
|
263
|
+
|
|
238
264
|
def _maybe_log_progress(self) -> None:
|
|
239
265
|
if not self._progress_enabled or self._prompt_started_at is None:
|
|
240
266
|
return
|
|
@@ -324,6 +350,22 @@ class ACPSession:
|
|
|
324
350
|
self.events.append(current)
|
|
325
351
|
self._pending_text.clear()
|
|
326
352
|
|
|
353
|
+
def _record_tool_call(self, record: ToolCallRecord) -> None:
|
|
354
|
+
"""Register a newly created tool-call record in every live structure.
|
|
355
|
+
|
|
356
|
+
Single bookkeeping site for the two creation paths in
|
|
357
|
+
:meth:`handle_update` (``tool_call``, and the ``tool_call_update``
|
|
358
|
+
fallback for unseen ids), so the distinct-title tracker can never
|
|
359
|
+
drift from the record list. ``title`` itself is never rewritten after
|
|
360
|
+
creation, but an empty-title record's display title follows ``kind``,
|
|
361
|
+
which the legacy-skill upgrade can rewrite — that site re-registers
|
|
362
|
+
the new display title (over-counting fails safe).
|
|
363
|
+
"""
|
|
364
|
+
self.tool_calls.append(record)
|
|
365
|
+
self._tool_call_map[record.tool_call_id] = record
|
|
366
|
+
self._seen_tool_titles.add(_tool_display_title(record.title, record.kind))
|
|
367
|
+
self.events.append({"type": "tool_call", "record": record})
|
|
368
|
+
|
|
327
369
|
_RECOGNIZED_UPDATE_TYPES = frozenset(
|
|
328
370
|
{
|
|
329
371
|
"tool_call",
|
|
@@ -356,9 +398,7 @@ class ACPSession:
|
|
|
356
398
|
update.get("kind", "other"), update.get("title", "")
|
|
357
399
|
),
|
|
358
400
|
)
|
|
359
|
-
self.
|
|
360
|
-
self._tool_call_map[record.tool_call_id] = record
|
|
361
|
-
self.events.append({"type": "tool_call", "record": record})
|
|
401
|
+
self._record_tool_call(record)
|
|
362
402
|
|
|
363
403
|
elif update_type == "tool_call_update":
|
|
364
404
|
tc_id = update.get("toolCallId", "")
|
|
@@ -372,9 +412,7 @@ class ACPSession:
|
|
|
372
412
|
update.get("kind", "tool"), update.get("title", "")
|
|
373
413
|
),
|
|
374
414
|
)
|
|
375
|
-
self.
|
|
376
|
-
self._tool_call_map[tc_id] = record
|
|
377
|
-
self.events.append({"type": "tool_call", "record": record})
|
|
415
|
+
self._record_tool_call(record)
|
|
378
416
|
try:
|
|
379
417
|
status = ToolCallStatus(update.get("status", "in_progress"))
|
|
380
418
|
except ValueError:
|
|
@@ -390,6 +428,14 @@ class ACPSession:
|
|
|
390
428
|
record.kind, record.title, record.content
|
|
391
429
|
):
|
|
392
430
|
record.kind = "skill"
|
|
431
|
+
# An empty-title record's DISPLAY title falls back to kind, so
|
|
432
|
+
# this upgrade can change what renders. Re-register the new
|
|
433
|
+
# display title: the set may now over-count (creation-time
|
|
434
|
+
# fallback + "skill"), which fails safe — the cell keeps the
|
|
435
|
+
# last: suffix instead of falsely claiming a single tool.
|
|
436
|
+
self._seen_tool_titles.add(
|
|
437
|
+
_tool_display_title(record.title, record.kind)
|
|
438
|
+
)
|
|
393
439
|
|
|
394
440
|
elif update_type == "agent_message_chunk":
|
|
395
441
|
content = update.get("content", {})
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
Renders a single Rich :class:`~rich.live.Live` panel — a progress bar with ETA,
|
|
4
4
|
queued/running/passed/failed/errored counts, a "running now" table, and running
|
|
5
5
|
token / cost / pass-rate totals — fed by the :class:`~benchflow.evaluation.Evaluation`
|
|
6
|
-
engine's ``on_plan`` / ``on_task_start`` / ``on_result`` hooks
|
|
6
|
+
engine's ``on_plan`` / ``on_task_start`` / ``on_result`` hooks, plus render-time
|
|
7
|
+
polls of the live-activity registry for the running tasks' in-flight session
|
|
8
|
+
counters (activity cells and the footer's live token sum).
|
|
7
9
|
|
|
8
10
|
TTY-only by contract: the CLI keeps its plain ``logger.info`` lines when stdout
|
|
9
11
|
isn't a terminal (CI, pipes, parity files), so machine-readable output is never
|
|
@@ -149,18 +151,21 @@ _PHASE_LABELS = {
|
|
|
149
151
|
_PHASE_FALLBACK = "starting…"
|
|
150
152
|
|
|
151
153
|
|
|
152
|
-
def _activity_cell(
|
|
154
|
+
def _activity_cell(snap: live_activity.ActivitySnapshot | None) -> str:
|
|
153
155
|
"""Per-task activity for the "running now" table, e.g.
|
|
154
156
|
``38 calls · last: file_editor``.
|
|
155
157
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
Pure formatter over one polled :class:`~benchflow._utils.live_activity.
|
|
159
|
+
ActivitySnapshot` — ``__rich__`` polls the registry exactly once per
|
|
160
|
+
running task per frame and shares the snapshots with the footer's live
|
|
161
|
+
token sum. The counters are the same ones the console heartbeat logs,
|
|
162
|
+
which the Live display otherwise mutes. Until the agent session exists
|
|
163
|
+
(and after it is closed for the verifier) the cell shows the rollout's
|
|
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 only once the
|
|
166
|
+
session has a usage snapshot (i.e. after a completed prompt); once they
|
|
167
|
+
do, a single-tool agent's cell is ``38 calls · 412.0k tok`` (no ``last:``).
|
|
162
168
|
"""
|
|
163
|
-
snap = live_activity.activity(name)
|
|
164
169
|
if snap is None:
|
|
165
170
|
return _PHASE_FALLBACK
|
|
166
171
|
counters = snap.counters
|
|
@@ -169,7 +174,12 @@ def _activity_cell(name: str) -> str:
|
|
|
169
174
|
cell = f"{counters.tool_calls} calls"
|
|
170
175
|
if counters.total_tokens:
|
|
171
176
|
cell += f" · {_fmt_tokens(counters.total_tokens)} tok"
|
|
172
|
-
|
|
177
|
+
# A single-tool agent (prime-agent funnels every call through one IPython
|
|
178
|
+
# tool) makes "last: <name>" a constant: once tokens carry the signal,
|
|
179
|
+
# drop it. Varied tool names — and unknown distinct counts (0), and a
|
|
180
|
+
# first lone call, where the name is still news — keep the last: suffix.
|
|
181
|
+
constant_tool = counters.tool_calls > 1 and counters.distinct_tools == 1
|
|
182
|
+
if counters.last_tool and not (constant_tool and counters.total_tokens):
|
|
173
183
|
cell += f" · last: {counters.last_tool[:30]}"
|
|
174
184
|
return cell
|
|
175
185
|
|
|
@@ -335,6 +345,13 @@ class LiveEvalProgress:
|
|
|
335
345
|
|
|
336
346
|
parts: list[RenderableType] = [header, bar, counts]
|
|
337
347
|
|
|
348
|
+
# ONE registry poll per running task per frame (each poll an O(1)
|
|
349
|
+
# counter read; see live_activity), shared by the running-now cells
|
|
350
|
+
# and the footer's live token sum — displayed rows are never polled
|
|
351
|
+
# twice, and cell vs footer can't read different snapshots within a
|
|
352
|
+
# frame.
|
|
353
|
+
snaps = {name: live_activity.activity(name) for name in running}
|
|
354
|
+
|
|
338
355
|
# "Running now" — cap rows so short terminals don't overflow.
|
|
339
356
|
if running:
|
|
340
357
|
tbl = Table(
|
|
@@ -354,16 +371,34 @@ class LiveEvalProgress:
|
|
|
354
371
|
tbl.add_row(
|
|
355
372
|
Text(name),
|
|
356
373
|
_fmt_dur(now - running[name]),
|
|
357
|
-
Text(_activity_cell(name), style="dim"),
|
|
374
|
+
Text(_activity_cell(snaps.get(name)), style="dim"),
|
|
358
375
|
)
|
|
359
376
|
extra = len(running) - _MAX_RUNNING_ROWS
|
|
360
377
|
if extra > 0:
|
|
361
378
|
tbl.add_row(f"… {extra} more", "", "")
|
|
362
379
|
parts.append(tbl)
|
|
363
380
|
|
|
364
|
-
# Footer: pass-rate (excl errors) + token/cost economics.
|
|
365
|
-
#
|
|
366
|
-
#
|
|
381
|
+
# Footer: pass-rate (excl errors) + token/cost economics. Tokens sum
|
|
382
|
+
# the completed tasks' trusted telemetry PLUS the running sessions'
|
|
383
|
+
# live ACP usage (stepping forward as each prompt completes), so a
|
|
384
|
+
# 51-minute agent phase shows its spend while it runs, not only at
|
|
385
|
+
# scoring. The total is NOT monotonic across a task's completion
|
|
386
|
+
# boundary: scoring swaps the ACP self-report for the gateway
|
|
387
|
+
# measurement (which can be lower), and a task completing with
|
|
388
|
+
# untrusted/absent telemetry drops its live contribution entirely —
|
|
389
|
+
# a sole-task footer can collapse back to "— tokens". Clamping would
|
|
390
|
+
# falsify the trusted sum, so the dip is intended. Show "—" (not 0 /
|
|
391
|
+
# $0.00) when neither signal exists, so a coverage-0 run reads
|
|
392
|
+
# broken, not free — matching the summary.json contract. Cost stays
|
|
393
|
+
# completed-tasks-only: $ comes from the sandbox LiteLLM gateway log
|
|
394
|
+
# imported at scoring time (BenchFlow computes no prices of its own),
|
|
395
|
+
# so there is no live $ to show.
|
|
396
|
+
live_tokens = sum(
|
|
397
|
+
snap.counters.total_tokens or 0
|
|
398
|
+
for snap in snaps.values()
|
|
399
|
+
if snap is not None and snap.counters is not None
|
|
400
|
+
)
|
|
401
|
+
|
|
367
402
|
footer = Text()
|
|
368
403
|
scored = passed + failed
|
|
369
404
|
if scored:
|
|
@@ -371,7 +406,12 @@ class LiveEvalProgress:
|
|
|
371
406
|
else:
|
|
372
407
|
footer.append("pass-rate —", style="dim")
|
|
373
408
|
footer.append(" · ")
|
|
374
|
-
footer.append(
|
|
409
|
+
footer.append(
|
|
410
|
+
f"{_fmt_tokens(tokens + live_tokens)} tokens"
|
|
411
|
+
if covered or live_tokens
|
|
412
|
+
else "— tokens",
|
|
413
|
+
"dim",
|
|
414
|
+
)
|
|
375
415
|
footer.append(" · ")
|
|
376
416
|
footer.append(f"${cost:.2f}" if covered else "$—", style="dim")
|
|
377
417
|
if completed:
|
|
@@ -759,7 +759,8 @@ class Rollout:
|
|
|
759
759
|
def activity_snapshot(self) -> ActivitySnapshot:
|
|
760
760
|
"""The eval dashboard's per-task :class:`ActivitySnapshot`: the
|
|
761
761
|
current lifecycle phase plus the live :class:`SessionCounters` (tool
|
|
762
|
-
calls, last tool title, total tokens
|
|
762
|
+
calls, last tool title, total tokens, distinct tool titles).
|
|
763
|
+
``counters`` is None before
|
|
763
764
|
the agent session exists — the phase then carries the cell
|
|
764
765
|
("creating sandbox…", "verifying…"), so a 90s sandbox create is not
|
|
765
766
|
indistinguishable from a hang.
|
|
@@ -775,7 +776,10 @@ class Rollout:
|
|
|
775
776
|
calls, last_title = session.progress_snapshot()
|
|
776
777
|
usage = session.latest_usage_totals()
|
|
777
778
|
tokens = usage.get("total_tokens") if usage else None
|
|
778
|
-
return ActivitySnapshot(
|
|
779
|
+
return ActivitySnapshot(
|
|
780
|
+
self._phase,
|
|
781
|
+
SessionCounters(calls, last_title, tokens, session.distinct_tool_titles),
|
|
782
|
+
)
|
|
779
783
|
|
|
780
784
|
@property
|
|
781
785
|
def trajectory(self) -> list[dict]:
|
|
@@ -10,10 +10,14 @@ import contextlib
|
|
|
10
10
|
import logging
|
|
11
11
|
from types import SimpleNamespace
|
|
12
12
|
|
|
13
|
+
import pytest
|
|
13
14
|
from rich.console import Console
|
|
14
15
|
|
|
16
|
+
from benchflow._utils import live_activity
|
|
17
|
+
from benchflow._utils.live_activity import ActivitySnapshot, SessionCounters
|
|
15
18
|
from benchflow.cli._live_progress import (
|
|
16
19
|
LiveEvalProgress,
|
|
20
|
+
_activity_cell,
|
|
17
21
|
progress_enabled,
|
|
18
22
|
quiet_root_logging,
|
|
19
23
|
)
|
|
@@ -34,6 +38,36 @@ def _dash() -> LiveEvalProgress:
|
|
|
34
38
|
)
|
|
35
39
|
|
|
36
40
|
|
|
41
|
+
@contextlib.contextmanager
|
|
42
|
+
def _registered_rollouts(rollouts: dict):
|
|
43
|
+
"""Register fake rollouts and guarantee unregistration.
|
|
44
|
+
|
|
45
|
+
Values are the ActivitySnapshot to serve — or an Exception instance to
|
|
46
|
+
raise from ``activity_snapshot()`` (a teardown-racing rollout).
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def _fake(snap):
|
|
50
|
+
if isinstance(snap, Exception):
|
|
51
|
+
|
|
52
|
+
def _boom():
|
|
53
|
+
raise snap
|
|
54
|
+
|
|
55
|
+
return SimpleNamespace(activity_snapshot=_boom)
|
|
56
|
+
return SimpleNamespace(activity_snapshot=lambda: snap)
|
|
57
|
+
|
|
58
|
+
for name, snap in rollouts.items():
|
|
59
|
+
live_activity.register(name, _fake(snap))
|
|
60
|
+
try:
|
|
61
|
+
yield
|
|
62
|
+
finally:
|
|
63
|
+
for name in rollouts:
|
|
64
|
+
live_activity.unregister(name)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _counters_snap(tokens, *, calls=3, last="file_editor", distinct=2):
|
|
68
|
+
return ActivitySnapshot("connected", SessionCounters(calls, last, tokens, distinct))
|
|
69
|
+
|
|
70
|
+
|
|
37
71
|
def test_counts_classify_like_the_engine():
|
|
38
72
|
d = _dash()
|
|
39
73
|
d.on_plan(total=4, done=0, remaining=4)
|
|
@@ -93,7 +127,85 @@ def test_trusted_telemetry_accumulates():
|
|
|
93
127
|
assert d._covered == 2
|
|
94
128
|
|
|
95
129
|
|
|
130
|
+
def _rendered(d: LiveEvalProgress) -> str:
|
|
131
|
+
import io
|
|
132
|
+
|
|
133
|
+
out = Console(file=io.StringIO(), width=200)
|
|
134
|
+
out.print(d.__rich__())
|
|
135
|
+
return out.file.getvalue()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def test_footer_sums_live_running_usage_with_completed():
|
|
139
|
+
# Mid-run spend visibility (51-min single-task dogfood: footer read
|
|
140
|
+
# "— tokens · $—" for the whole agent phase): the footer must sum the
|
|
141
|
+
# completed tasks' trusted telemetry PLUS every running session's live
|
|
142
|
+
# usage. Cost stays completed-only — $ exists only in the scoring-time
|
|
143
|
+
# LiteLLM gateway import.
|
|
144
|
+
with _registered_rollouts(
|
|
145
|
+
{"task-a": _counters_snap(1_000_000), "task-b": _counters_snap(500_000)}
|
|
146
|
+
):
|
|
147
|
+
d = _dash()
|
|
148
|
+
d.on_plan(total=3, done=0, remaining=3)
|
|
149
|
+
for name in ("task-a", "task-b", "task-c"):
|
|
150
|
+
d.on_task_start(name)
|
|
151
|
+
d.on_result(
|
|
152
|
+
"task-c", _result(1.0, tokens=2_500_000, cost=0.02, src="provider_response")
|
|
153
|
+
)
|
|
154
|
+
text = _rendered(d)
|
|
155
|
+
assert "4.00M tokens" in text
|
|
156
|
+
assert "$0.02" in text
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_footer_shows_live_usage_before_any_completion():
|
|
160
|
+
# The single-task common case: no task has finished, but the running
|
|
161
|
+
# session has per-completed-prompt usage — real tokens render, and $
|
|
162
|
+
# stays "—" (no live price signal exists).
|
|
163
|
+
with _registered_rollouts({"task-a": _counters_snap(750_000)}):
|
|
164
|
+
d = _dash()
|
|
165
|
+
d.on_plan(total=1, done=0, remaining=1)
|
|
166
|
+
d.on_task_start("task-a")
|
|
167
|
+
text = _rendered(d)
|
|
168
|
+
assert "750.0k tokens" in text
|
|
169
|
+
assert "$—" in text
|
|
170
|
+
assert "— tokens" not in text
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_footer_degrades_to_dash_without_any_usage_signal():
|
|
174
|
+
# No completed telemetry and no live counters (counter-less snapshot, a
|
|
175
|
+
# teardown-racing rollout whose snapshot raises, an unregistered task):
|
|
176
|
+
# the footer keeps the "—" contract — a coverage-0 run reads broken, not
|
|
177
|
+
# free — and never raises.
|
|
178
|
+
with _registered_rollouts(
|
|
179
|
+
{
|
|
180
|
+
"warming": ActivitySnapshot("setup", None),
|
|
181
|
+
"racing": RuntimeError("teardown race"),
|
|
182
|
+
}
|
|
183
|
+
):
|
|
184
|
+
d = _dash()
|
|
185
|
+
d.on_plan(total=3, done=0, remaining=3)
|
|
186
|
+
for name in ("warming", "racing", "unregistered"):
|
|
187
|
+
d.on_task_start(name)
|
|
188
|
+
text = _rendered(d)
|
|
189
|
+
assert "— tokens" in text
|
|
190
|
+
assert "$—" in text
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_footer_live_usage_ignores_sessions_without_usage():
|
|
194
|
+
# A running session before its first completed prompt reports
|
|
195
|
+
# total_tokens=None — it must contribute 0, not poison the sum.
|
|
196
|
+
with _registered_rollouts(
|
|
197
|
+
{"task-a": _counters_snap(None), "task-b": _counters_snap(250_000)}
|
|
198
|
+
):
|
|
199
|
+
d = _dash()
|
|
200
|
+
d.on_plan(total=2, done=0, remaining=2)
|
|
201
|
+
d.on_task_start("task-a")
|
|
202
|
+
d.on_task_start("task-b")
|
|
203
|
+
assert "250.0k tokens" in _rendered(d)
|
|
204
|
+
|
|
205
|
+
|
|
96
206
|
class _FakeSession:
|
|
207
|
+
distinct_tool_titles = 4
|
|
208
|
+
|
|
97
209
|
def progress_snapshot(self):
|
|
98
210
|
return 38, "file_editor"
|
|
99
211
|
|
|
@@ -101,29 +213,49 @@ class _FakeSession:
|
|
|
101
213
|
return {"total_tokens": 1500}
|
|
102
214
|
|
|
103
215
|
|
|
104
|
-
def
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
# the
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
216
|
+
def test_activity_cell_formats_counters_and_registry_miss():
|
|
217
|
+
# Pure formatter over one polled snapshot — __rich__ polls the registry
|
|
218
|
+
# once per running task per frame and shares snapshots between the cells
|
|
219
|
+
# and the footer sum. distinct_tools=None (unknown, e.g. an old-style
|
|
220
|
+
# producer) must degrade to the full last:-suffixed cell, never mislabel.
|
|
221
|
+
snap = ActivitySnapshot("connected", SessionCounters(38, "file_editor", 1500))
|
|
222
|
+
assert _activity_cell(snap) == "38 calls · 1.5k tok · last: file_editor"
|
|
223
|
+
# Registry misses (pre-register, teardown races) hand the formatter None —
|
|
224
|
+
# a live row's cell must never be blank, and never raise.
|
|
225
|
+
assert _activity_cell(None) == "starting…"
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
@pytest.mark.parametrize(
|
|
229
|
+
("counters", "expected"),
|
|
230
|
+
[
|
|
231
|
+
# Single-tool agents (prime-agent funnels everything through one
|
|
232
|
+
# IPython tool): "last: IPython cell" is a constant across all N
|
|
233
|
+
# calls — once tokens are available they carry the information.
|
|
234
|
+
(
|
|
235
|
+
SessionCounters(38, "IPython cell", 412_000, 1),
|
|
236
|
+
"38 calls · 412.0k tok",
|
|
118
237
|
),
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
238
|
+
# Varied tool names: last: still carries information.
|
|
239
|
+
(
|
|
240
|
+
SessionCounters(38, "file_editor", 412_000, 5),
|
|
241
|
+
"38 calls · 412.0k tok · last: file_editor",
|
|
242
|
+
),
|
|
243
|
+
# Constant tool but no tokens yet (first prompt still running): the
|
|
244
|
+
# name, shown once, is still the only signal — it stays.
|
|
245
|
+
(
|
|
246
|
+
SessionCounters(5, "IPython cell", None, 1),
|
|
247
|
+
"5 calls · last: IPython cell",
|
|
248
|
+
),
|
|
249
|
+
# A lone first call is trivially "constant" but the name is still
|
|
250
|
+
# news; the drop only pays off once repetition makes it redundant.
|
|
251
|
+
(
|
|
252
|
+
SessionCounters(1, "IPython cell", 90_000, 1),
|
|
253
|
+
"1 calls · 90.0k tok · last: IPython cell",
|
|
254
|
+
),
|
|
255
|
+
],
|
|
256
|
+
)
|
|
257
|
+
def test_activity_cell_constant_vs_varied_tools(counters, expected):
|
|
258
|
+
assert _activity_cell(ActivitySnapshot("connected", counters)) == expected
|
|
127
259
|
|
|
128
260
|
|
|
129
261
|
def test_rollout_activity_snapshot_reads_acp_session():
|
|
@@ -136,7 +268,7 @@ def test_rollout_activity_snapshot_reads_acp_session():
|
|
|
136
268
|
_acp_client=SimpleNamespace(session=_FakeSession()), _phase="connected"
|
|
137
269
|
)
|
|
138
270
|
assert Rollout.activity_snapshot(connected) == ActivitySnapshot(
|
|
139
|
-
"connected", SessionCounters(38, "file_editor", 1500)
|
|
271
|
+
"connected", SessionCounters(38, "file_editor", 1500, 4)
|
|
140
272
|
)
|
|
141
273
|
# Pre-connect (and session-factory) rollouts have no client: counters are
|
|
142
274
|
# None but the lifecycle phase still rides out so the cell can label it.
|
|
@@ -148,83 +280,36 @@ def test_rollout_activity_snapshot_reads_acp_session():
|
|
|
148
280
|
def test_dashboard_renders_activity_for_registered_running_task():
|
|
149
281
|
# End-to-end through __rich__: a registered running task's activity must
|
|
150
282
|
# appear in the rendered panel — reverting the table wiring fails this.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
from benchflow._utils.live_activity import ActivitySnapshot, SessionCounters
|
|
155
|
-
|
|
156
|
-
live_activity.register(
|
|
157
|
-
"edit-pdf",
|
|
158
|
-
SimpleNamespace(
|
|
159
|
-
activity_snapshot=lambda: ActivitySnapshot(
|
|
160
|
-
"connected", SessionCounters(38, "file_editor", None)
|
|
161
|
-
)
|
|
162
|
-
),
|
|
163
|
-
)
|
|
164
|
-
try:
|
|
283
|
+
with _registered_rollouts(
|
|
284
|
+
{"edit-pdf": _counters_snap(None, calls=38, last="file_editor")}
|
|
285
|
+
):
|
|
165
286
|
d = _dash()
|
|
166
287
|
d.on_plan(total=1, done=0, remaining=1)
|
|
167
288
|
d.on_task_start("edit-pdf")
|
|
168
|
-
|
|
169
|
-
out.print(d.__rich__())
|
|
170
|
-
text = out.file.getvalue()
|
|
289
|
+
text = _rendered(d)
|
|
171
290
|
assert "38 calls" in text
|
|
172
291
|
assert "file_editor" in text
|
|
173
|
-
finally:
|
|
174
|
-
live_activity.unregister("edit-pdf")
|
|
175
292
|
|
|
176
293
|
|
|
177
294
|
def test_activity_cell_shows_phase_label_before_session_exists():
|
|
178
295
|
# Fresh-user dogfood follow-up: ~1.5min of sandbox create / agent install
|
|
179
296
|
# (and the whole verifier) used to render a blank cell — indistinguishable
|
|
180
297
|
# from a hang. Counter-less snapshots must surface the lifecycle phase.
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
live_activity.register(
|
|
187
|
-
"warming-up",
|
|
188
|
-
SimpleNamespace(activity_snapshot=lambda: ActivitySnapshot(phase, None)),
|
|
189
|
-
)
|
|
190
|
-
try:
|
|
191
|
-
assert _activity_cell("warming-up") == "creating sandbox…"
|
|
192
|
-
phase = "started"
|
|
193
|
-
assert _activity_cell("warming-up") == "installing agent…"
|
|
194
|
-
phase = "verifying"
|
|
195
|
-
assert _activity_cell("warming-up") == "verifying…"
|
|
196
|
-
# Unknown phases (e.g. "branched") still never blank the cell.
|
|
197
|
-
phase = "branched"
|
|
198
|
-
assert _activity_cell("warming-up") == "starting…"
|
|
199
|
-
d = _dash()
|
|
200
|
-
d.on_plan(total=1, done=0, remaining=1)
|
|
201
|
-
d.on_task_start("warming-up")
|
|
202
|
-
d.__rich__() # builds the running-now table row; must not raise
|
|
203
|
-
finally:
|
|
204
|
-
live_activity.unregister("warming-up")
|
|
298
|
+
assert _activity_cell(ActivitySnapshot("setup", None)) == "creating sandbox…"
|
|
299
|
+
assert _activity_cell(ActivitySnapshot("started", None)) == "installing agent…"
|
|
300
|
+
assert _activity_cell(ActivitySnapshot("verifying", None)) == "verifying…"
|
|
301
|
+
# Unknown phases (e.g. "branched") still never blank the cell.
|
|
302
|
+
assert _activity_cell(ActivitySnapshot("branched", None)) == "starting…"
|
|
205
303
|
|
|
206
304
|
|
|
207
305
|
def test_dashboard_renders_phase_label_for_counterless_task():
|
|
208
306
|
# End-to-end through __rich__: the phase label must reach the rendered
|
|
209
307
|
# panel, not just the cell helper — reverting the table wiring fails this.
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
from benchflow._utils import live_activity
|
|
213
|
-
from benchflow._utils.live_activity import ActivitySnapshot
|
|
214
|
-
|
|
215
|
-
live_activity.register(
|
|
216
|
-
"edit-pdf",
|
|
217
|
-
SimpleNamespace(activity_snapshot=lambda: ActivitySnapshot("started", None)),
|
|
218
|
-
)
|
|
219
|
-
try:
|
|
308
|
+
with _registered_rollouts({"edit-pdf": ActivitySnapshot("started", None)}):
|
|
220
309
|
d = _dash()
|
|
221
310
|
d.on_plan(total=1, done=0, remaining=1)
|
|
222
311
|
d.on_task_start("edit-pdf")
|
|
223
|
-
|
|
224
|
-
out.print(d.__rich__())
|
|
225
|
-
assert "installing agent…" in out.file.getvalue()
|
|
226
|
-
finally:
|
|
227
|
-
live_activity.unregister("edit-pdf")
|
|
312
|
+
assert "installing agent…" in _rendered(d)
|
|
228
313
|
|
|
229
314
|
|
|
230
315
|
def test_rollout_verify_marks_verifying_phase():
|
|
@@ -97,6 +97,56 @@ def test_progress_snapshot_whitespace_only_title(monkeypatch):
|
|
|
97
97
|
assert s.progress_snapshot() == (1, "")
|
|
98
98
|
|
|
99
99
|
|
|
100
|
+
def test_distinct_tool_titles_constant_vs_varied(monkeypatch):
|
|
101
|
+
"""Incremental distinct-title counter behind the dashboard's single-tool
|
|
102
|
+
detection (prime-agent: N identical "IPython cell" calls)."""
|
|
103
|
+
monkeypatch.setenv("BENCHFLOW_PROGRESS", "off")
|
|
104
|
+
s = ACPSession("sid")
|
|
105
|
+
assert s.distinct_tool_titles == 0
|
|
106
|
+
_drive_tool_call(s, "tc1")
|
|
107
|
+
_drive_tool_call(s, "tc2")
|
|
108
|
+
assert s.distinct_tool_titles == 1 # same title twice stays constant
|
|
109
|
+
# The tool_call_update fallback path (unseen id) also records the title.
|
|
110
|
+
s.handle_update(
|
|
111
|
+
{
|
|
112
|
+
"sessionUpdate": "tool_call_update",
|
|
113
|
+
"toolCallId": "tc3",
|
|
114
|
+
"title": "file_editor",
|
|
115
|
+
"kind": "edit",
|
|
116
|
+
"status": "in_progress",
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
assert s.distinct_tool_titles == 2
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def test_distinct_tool_titles_normalize_like_the_display(monkeypatch):
|
|
123
|
+
"""Distinct means "renders differently": multi-line titles compare by
|
|
124
|
+
first line (what the cell shows), and empty titles fall back to kind —
|
|
125
|
+
the same normalization progress_snapshot uses."""
|
|
126
|
+
monkeypatch.setenv("BENCHFLOW_PROGRESS", "off")
|
|
127
|
+
s = ACPSession("sid")
|
|
128
|
+
for call_id, title in (("a", "IPython cell\nx = 1"), ("b", "IPython cell\ny = 2")):
|
|
129
|
+
s.handle_update(
|
|
130
|
+
{
|
|
131
|
+
"sessionUpdate": "tool_call",
|
|
132
|
+
"toolCallId": call_id,
|
|
133
|
+
"title": title,
|
|
134
|
+
"kind": "execute",
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
assert s.distinct_tool_titles == 1
|
|
138
|
+
for call_id in ("c", "d"):
|
|
139
|
+
s.handle_update(
|
|
140
|
+
{
|
|
141
|
+
"sessionUpdate": "tool_call",
|
|
142
|
+
"toolCallId": call_id,
|
|
143
|
+
"title": "",
|
|
144
|
+
"kind": "execute",
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
assert s.distinct_tool_titles == 2 # "IPython cell" + kind-fallback "execute"
|
|
148
|
+
|
|
149
|
+
|
|
100
150
|
def test_heartbeat_silent_outside_prompt(monkeypatch, caplog):
|
|
101
151
|
"""No heartbeat before the first prompt or after mark_prompt_end."""
|
|
102
152
|
monkeypatch.setenv("BENCHFLOW_PROGRESS", "on")
|