benchflow 0.6.8.dev1907__tar.gz → 0.6.9__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.8.dev1907 → benchflow-0.6.9}/CHANGELOG.md +45 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/PKG-INFO +11 -1
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/README.md +1 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/pyproject.toml +15 -1
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/main.py +2 -0
- benchflow-0.6.9/src/benchflow/cli/traj.py +148 -0
- benchflow-0.6.9/src/benchflow/publish/azure_blob.py +142 -0
- benchflow-0.6.9/src/benchflow/publish/broker.py +195 -0
- benchflow-0.6.9/src/benchflow/publish/redact.py +209 -0
- benchflow-0.6.9/src/benchflow/publish/traj_capture.py +510 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/_base.py +22 -14
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/types.py +9 -2
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_process.py +34 -0
- benchflow-0.6.9/tests/test_publish_azure_blob.py +733 -0
- benchflow-0.6.9/tests/test_traj_upload_cli.py +373 -0
- benchflow-0.6.9/tests/test_trajectory_upload_service.py +1420 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/.gitignore +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/LICENSE +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_dotenv.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_paths.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_run.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_types.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/benchmark_repos.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/build_context_stage.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/config_override.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/content_address.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/dataset_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/env_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/evaluation_results.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/hf_datasets.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/json_safe.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/learner_memory.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/live_activity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/result_metadata.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/reward_events.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/scoring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/source_provenance.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/task_authoring/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/task_authoring/_evidence_paths.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/task_authoring/acceptance_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/task_authoring/scaffolding.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/task_authoring/structural_checks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/text.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/_utils/yaml_loader.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/client.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/container_transport.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/selection.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/session.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/transport.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/acp/types.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/_toolathlon.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/_toolathlon_container.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/_toolathlon_fake_mail.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/_toolathlon_poste_users.tsv +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/_toolathlon_services.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/harbor.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/inbound.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/inspect_ai.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/ors.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/resources/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/resources/mcp_atlas_bridge.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/resources/mcp_atlas_judge.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/adapters/source.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agent_router.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agent_router_guide.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agent_router_parity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agent_router_scaffold.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/codex_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/credentials.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/deepagents_acp_shim.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/errors.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/harvey_lab_acp_shim.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/install.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/openclaw_acp_shim.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/pi_acp_launcher.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/providers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/agents/remote_manifests.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/branch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/_failure_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/_hosted_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/_live_progress.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/_options.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/_shared.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/adopt.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/agent.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/continue_cmd.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/environment.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/eval_artifacts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/eval_lift.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/hub.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/monitor.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/review.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/sandbox.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/tasks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/trace_import.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/cli/train.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/batch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/orchestrator.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/replay_proxy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/run_folder.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/continue_run/sandbox_proxy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/contracts/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/contracts/planes.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/contracts/user.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/demo_task/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/demo_task/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/demo_task/task.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/demo_task/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/demo_task/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/diagnostics.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/_registry/env0@outage.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/_registry/env0@prod.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/manifest_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/environment/readiness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/eval_artifacts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/eval_lift.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/eval_plan.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/eval_sharding.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/eval_worker.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/evaluation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/experimental/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/experimental/mcp/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/experimental/mcp/hooks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/experimental/mcp/reviewer_server.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/hosted_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/hub/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/hub/harbor_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/integrations/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/integrations/trl/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/integrations/trl/spec.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/learner_skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/learner_store.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/loop_strategies.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/loop_sweep.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/metrics.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/models.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/monitor.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/litellm_bedrock_patch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/litellm_bedrock_preflight.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/litellm_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/litellm_logging.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/litellm_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/providers/runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/publish/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/publish/huggingface.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/py.typed +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/default-rubric.json +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/prompts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/runner.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/review/wrapper.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/README.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/builtins.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/events.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/file_readers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/llm.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/memory_scorer.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/node.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/rubric.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/rubric_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rewards/validation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_deadline.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_results.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_setup.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_usage.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/_user_loop.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/session_factory_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout/task_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout_branch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/rollout_planes.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_base.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_cache_reclaim.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_compose.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_compose_files/docker-compose-base.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_compose_files/docker-compose-build.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_compose_files/docker-compose-no-network.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_compose_files/docker-compose-prebuilt.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/_sdk_ops.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore_builder.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore_image.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore_provisioning.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore_reaper.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/agentcore_sealed.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/apple_container.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/daytona.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/daytona_dind.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/daytona_pty.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/daytona_reaper.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/daytona_strategies.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/docker.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/lockdown.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/metadata.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/modal_impl.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/agentcore.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/apple.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/daytona.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/process/docker.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/providers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/services.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/setup.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/snapshot.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sandbox/user.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/scenes.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/sdk.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/self_gen.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skill_eval/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skill_eval/_core.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skill_eval/gepa_export.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skill_eval/schema.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skill_policy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/_document_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/_document_normalize.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/_document_parse.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/_document_profiles.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/acceptance_live.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/acceptance_live_model.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/acceptance_live_report.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/acceptance_live_validation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/discovery.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/document.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/export.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/imports.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/output_format.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/package.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/paths.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/prompts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/runtime_capabilities.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/runtime_view.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/task.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_core.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_document.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_errors.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_judge_inputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_ors_episode.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_reward_kit.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_scan.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/task/verifier_script_strategy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/templates/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/templates/judge.py.tmpl +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/templates/test.sh.tmpl +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/huggingface.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/local.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/models.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/parsers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/traces/task_gen.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/training/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/training/backends/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/training/backends/prime_rl.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/training/run_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/_capture.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/_export_common.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/_llm_capture.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/call_purpose.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/export.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/export_adp.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/export_atif.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/export_prime_sft.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/export_trl_sft.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/metrics.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/results.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/tree.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/trl_sft_tokenization.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/trajectories/viewer.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/src/benchflow/usage_tracking.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/acceptance_live_harness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_manifest_dirscan.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_manifest_loader.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_manifest_parity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_manifest_wiring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_namespace_shorthand.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_plugin_entry_points.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/agents/test_remote_manifest_autoload.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/README.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/environment/docker-compose.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/environment/skills/conformance-writer/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/task.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/acp_smoke/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/conformance-results.json +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/proof_multi_agent.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/proof_snapshot.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/run_conformance.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conformance/self_gen_smoke_skills/skill-creator/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/conftest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/_helpers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/test_batch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/test_orchestrator.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/test_replay_proxy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/continue_run/test_run_folder.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_chibench_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_clawsbench_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_manifest_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/environment/test_readiness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/task.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/hello-world-task/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/test_claude.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/test_codex.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/test_codex_custom_provider.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/test_gemini.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/test_openclaw.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/traces/minimal-claude.jsonl +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/examples/traces/minimal-opentraces.jsonl +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/README.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/alpha-task/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/alpha-task/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/alpha-task/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/alpha-task/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/beta-task/data/empty.bin +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/beta-task/data/unicode.txt +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/beta-task/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/beta-task/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/digest/not-a-task/notes.txt +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/mock_acp_agent.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/mock_acp_agent_interleaved.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/mock_acp_agent_multi_turn.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/mock_openai_responses_server.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/data/michigan_stations.txt +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/flood-detection/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/nws-flood-thresholds/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/environment/skills/usgs-data-download/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/flood-risk-analysis/tests/test_outputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/climate.csv +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/hydrology.csv +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/land_cover.csv +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/data/water_temperature.csv +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/contribution-analysis/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/meteorology-driver-classification/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/pca-decomposition/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/environment/skills/trend-analysis/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/lake-warming-attribution/tests/test_outputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/manifest.json +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/r2r_simulator.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/finite-horizon-lqr/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/integral-action-design/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/mpc-horizon-tuning/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/skills/state-space-linearization/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/environment/system_config.json +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/r2r-mpc-control/tests/test_outputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/generate_training_pcaps.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/local.rules +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/pcap-triage-tshark/scripts/summarize_http_requests.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-offline-evejson/scripts/run_suricata_offline.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/skills/suricata-rules-basics/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/environment/suricata.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/suricata-custom-exfil/tests/test_outputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/Dockerfile +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syz-extract-constants/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzkaller-build-loop/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/environment/skills/syzlang-ioctl-basics/SKILL.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/instruction.md +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/solution/solve.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/task.toml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/fixtures/skillsbench_slice/syzkaller-ppdev-syzlang/tests/test_outputs.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/_consistency.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/agent_judge.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/check_adapter_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/check_hosted_env_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/check_results.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/check_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/claude-agent-acp.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/codex-acp.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/gemini.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/harvey-lab-harness.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/mimo.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/openclaw.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/opencode.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/openhands.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/configs/pi-acp.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/deepagents_harness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/rubric_checks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/run.sh +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/run_suite.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/scenarios.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/integration/suites/release.yaml +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acceptance_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acceptance_live.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acceptance_live_execution.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp_capability_advertising.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp_mcp_servers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp_model_config_dispatch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp_pinned_protocol_guard.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_acp_setup_failure_propagation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_adapter_scripts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_adapters.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_env_resolution.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_gemini_defaults.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_idle_timeout_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_model_decouple.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_router.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_router_cli_e2e.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_router_scaffold.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_setup.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agent_spec.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agentcore_builder.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agentcore_parallel.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agentcore_reaper.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agentcore_sandbox.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_agentcore_transport.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_api_error_capture.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_apple_container_sandbox.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_bare_model_provider.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_base_install_imports.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_bedrock_thinking.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_benchflow_experiment_review_validator.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_benchmark_repos_resolve_repo_path.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_branch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_build_context_stage.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_build_review_pack.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_capture_trajectory.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_check_skillsbench_harbor_parity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_clawsbench_slice.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_adopt_aliases.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_arg_validation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_daytona.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_docs_drift.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_edge_case_hardening.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_hub_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_live_progress.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_cli_misc.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_codex_review.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_codex_self_write_auth.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_config_override.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_config_redaction.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_connect_as_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_console_error_truncation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_console_progress.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_continuallearningbench_adapter.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_dataset_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_command_polling.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_dind_compose_up.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_download.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_litellm_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_poll_deadline.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_daytona_reap.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_deepagents_agent.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_diagnostics.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_docker_prune_scoping.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_docker_uploads.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_docs_examples.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eng50_capabilities.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_env_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_env_setup.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_environment_manifest_controls.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_artifact_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_filters_applied.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_lift.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_sharding.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_single_task_summary.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_source_provenance.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_worker_retry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_eval_zero_task_guard.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_evaluation_environment_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_exclude_tasks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_filter_credentialed_cells.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_harvey_lab_shim.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_hilbench_adapter.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_hosted_env.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_hosted_env_rollout_contract.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_hub_harbor_registry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_inbound_adapter_manifest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_inbound_adapters.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_agent_judge.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_check_results.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_consistency.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_matrix.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_provider_selection.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_run_suite.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_integration_suite.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_internet_policy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_job.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_job_sequential_shared.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_job_sequential_shared_resume.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_judge_robustness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_judge_symlink_ingestion.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_learner_skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_learner_skills_traversal.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_learner_store.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_learner_store_persistence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_hardening.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_logging.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_model_via_env_generic.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_reasoning_passthrough.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_litellm_smoke.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_live_llm_trajectory.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_llm_judge.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_llm_judge_event_tags.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_llm_judge_verifier.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_loop_strategies.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_loop_summary.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_loop_sweep.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_memory_scorer.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_metrics.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_mle_bench_adapter.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_mock_openai_responses_server.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_monitor_scaffold.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_native_acp_usage.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_no_cross_provider_fallback.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_notification_order_real.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_opencode_family_proxy_tracking.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_oracle.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_oracle_chokepoint.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_paths_safe.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_paths_symlink_helpers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_pi_acp_launcher.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_pi_acp_proxy_routing.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_project_skills_layout.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_provider_auth_detection.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_providers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_reexport.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_registry_invariants.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_release_hardening_r5.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_release_version.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_release_workflow_wiring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_resolve_env_helpers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_review_boundaries.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_review_rubric.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_review_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_reward_lenient.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_reward_node.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_reward_range.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_reward_unified_contract.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rewards.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rewards_jsonl.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_architecture.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_branch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_config_path_coercion.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_environment.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_hard_deadline.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_import_no_side_effects.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_on_ask_user_wiring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_planes_contract.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_probe_sandbox_health.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_session_factory_dispatch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_setup_commands.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rollout_upload.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rubric_checks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_rubric_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_runtime_capabilities.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_runtime_config_wired.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_runtime_live_sandbox.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_exec_secret_handling.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_hardening.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_isolation_copy_traversal.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_live_process.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_multi_service.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_prebuilt_validation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_protocol.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_provider_registry_drift.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_setup.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_snapshot_contract.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_upload_symlink.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sandbox_verifier_workspace.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_scene.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_scene_outbox_trial.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_scene_parallel_group.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_scene_result_aggregation.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_scoring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sdk_internals.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sdk_lockdown.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sdk_run_alias.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_sealed_channel_container.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_self_gen_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_self_gen_export_error_channel.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_self_gen_export_failures.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_self_gen_orchestration.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_session_factory_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_session_request_permission_dispatch.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_eval.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_eval_dryrun.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_eval_integration.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_eval_sweep.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_eval_traversal.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_invocation_artifacts.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skill_policy.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skills.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skills_dir_agent_home_link.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skillsbench_conversion_conformance.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_skillsbench_harbor_run_suite.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_smoke.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_smoke_wiring.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_source_adapters.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_subscription_auth.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_check_eval_consistency.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_digest.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_document.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_download.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_export.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_output_format.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_package.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_task_runtime_primitive.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_tasks.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_token_usage_normalization.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trace_import_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trace_task_gen_traversal.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trace_to_task_evidence.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_traces_huggingface.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_traces_parsers.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_traces_task_gen.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_train_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_train_mode_artifact_emission.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_train_trl_cli.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trajectory_integration.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trajectory_streaming.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trial_agent_timeout_verify.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trial_install_agent_timeout.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trial_litellm_runtime.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_trl_integration.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_usage_litellm.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_usage_required.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_usage_tracking.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_user.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_v06_guard_ports.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_document.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_multi_container.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_output.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_output_freshness.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_strategies.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verifier_wedge_retry.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_verify.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_workflow_action_pinning.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/test_yaml_config.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/__init__.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export_adp.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export_atif.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export_common.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export_nan_handling.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_export_prime_sft.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_redaction.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_step_granularity.py +0 -0
- {benchflow-0.6.8.dev1907 → benchflow-0.6.9}/tests/trajectories/test_tree.py +0 -0
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## 0.6.9 — 2026-08-15
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **Trajectory uploads require contributor provenance.** The single
|
|
9
|
+
`bench traj upload` command now requires `--github-id` and `--email`; both
|
|
10
|
+
values are validated locally and server-side and stored in `manifest.json`
|
|
11
|
+
under the structured `contributor` field. Existing 0.6.8 manifests remain
|
|
12
|
+
readable by the validator during the client transition.
|
|
13
|
+
|
|
14
|
+
## 0.6.8 — 2026-08-15
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- **Public trajectory contribution.** `bench traj upload PATH` validates and
|
|
18
|
+
structurally redacts trajectory JSONL, creates a content-addressed manifest,
|
|
19
|
+
and uploads through the built-in public broker. Azure Blob quarantine,
|
|
20
|
+
versioning, short-lived create-only user-delegation SAS grants, and an
|
|
21
|
+
event-driven fail-closed validator keep untrusted captures out of the
|
|
22
|
+
community namespace until hashes, sizes, strict JSONL (including duplicate-key
|
|
23
|
+
and non-finite-number rejection), and artifact/manifest secret scans pass.
|
|
24
|
+
Replaying an ingested digest is a no-op; trusted operators can opt into direct
|
|
25
|
+
Azure upload with the `azure` extra and `--direct`.
|
|
26
|
+
|
|
5
27
|
### Changed
|
|
6
28
|
- **BREAKING (task.md): the `environment:` frontmatter key is renamed to
|
|
7
29
|
`sandbox:`.** The native task-config surface now accepts only `sandbox:`
|
|
@@ -26,6 +48,29 @@
|
|
|
26
48
|
eval-config `environment:` docker/daytona selector) is a different
|
|
27
49
|
subsystem and is unchanged.
|
|
28
50
|
|
|
51
|
+
### Fixed
|
|
52
|
+
- **Coherent integration coverage for code-and-fixture changes.** The
|
|
53
|
+
credential-free fixture job now tests pull-request source together with its
|
|
54
|
+
task fixtures, while the secret-bearing smoke job retains trusted fixtures;
|
|
55
|
+
the release gate requires both results. (#969)
|
|
56
|
+
- **Retryable Daytona transport failures stay retryable.** Transient SDK
|
|
57
|
+
transport errors are stamped while their vendor type is still available,
|
|
58
|
+
empty exception messages retain useful type information, and permanent
|
|
59
|
+
errors remain outside the retry policy. (#970)
|
|
60
|
+
- **Live token counters no longer freeze behind callback-log reads.** Larger,
|
|
61
|
+
bounded ranged reads distinguish EOF from read failure, expose lag, and keep
|
|
62
|
+
terminal phase labels from moving backwards. (#971)
|
|
63
|
+
- **Fresh OpenClaw installs and GPT-5.4 calls use compatible limits.** OpenClaw
|
|
64
|
+
is pinned to a Node-compatible runtime, and raw plus ACP-alias GPT-5.4 model
|
|
65
|
+
IDs clamp output tokens to the provider's 128,000-token limit. (#977, #986)
|
|
66
|
+
- **Anthropic Vertex routes include their required runtime.** The gateway now
|
|
67
|
+
installs the Google Cloud Vertex AI SDK used by LiteLLM's Anthropic Vertex
|
|
68
|
+
path. (#978)
|
|
69
|
+
- **ACP subprocess diagnostics survive normal teardown.** A bounded, redacted
|
|
70
|
+
stderr tail is retained even when stdout remains open; stderr drain failures
|
|
71
|
+
cannot mask the structured transport diagnosis, and repeated process close
|
|
72
|
+
calls are idempotent. (#980)
|
|
73
|
+
|
|
29
74
|
## 0.6.7 — 2026-08-09
|
|
30
75
|
|
|
31
76
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: benchflow
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.9
|
|
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
|
|
@@ -29,6 +29,15 @@ Requires-Dist: pyyaml>=6.0
|
|
|
29
29
|
Requires-Dist: rich>=13.0
|
|
30
30
|
Requires-Dist: tomli-w>=1.0
|
|
31
31
|
Requires-Dist: typer>=0.9
|
|
32
|
+
Provides-Extra: azure
|
|
33
|
+
Requires-Dist: azure-identity>=1.16; extra == 'azure'
|
|
34
|
+
Requires-Dist: azure-storage-blob>=12.19; extra == 'azure'
|
|
35
|
+
Provides-Extra: azure-service
|
|
36
|
+
Requires-Dist: azure-data-tables>=12.5; extra == 'azure-service'
|
|
37
|
+
Requires-Dist: azure-identity>=1.16; extra == 'azure-service'
|
|
38
|
+
Requires-Dist: azure-storage-blob>=12.19; extra == 'azure-service'
|
|
39
|
+
Requires-Dist: azure-storage-queue>=12.9; extra == 'azure-service'
|
|
40
|
+
Requires-Dist: uvicorn>=0.30; extra == 'azure-service'
|
|
32
41
|
Provides-Extra: bedrock
|
|
33
42
|
Requires-Dist: boto3>=1.40; extra == 'bedrock'
|
|
34
43
|
Provides-Extra: deepagents
|
|
@@ -146,6 +155,7 @@ Start with [Getting started](./docs/getting-started.md), then [Concepts](./docs/
|
|
|
146
155
|
| Multi-agent: coder + reviewer, simulated user, BYOS, stateful envs | [Use cases](./docs/use-cases.md) |
|
|
147
156
|
| Multi-round single-agent (progressive disclosure, oracle access) | [Progressive disclosure](./docs/progressive-disclosure.md) |
|
|
148
157
|
| Skill evaluation (when the artifact is a skill, not a workspace) | [Skill eval](./docs/skill-eval.md) |
|
|
158
|
+
| Contribute a trajectory capture | [Trajectory upload](./docs/traj-upload.md) |
|
|
149
159
|
| Understand the security model | [Sandbox hardening](./docs/sandbox-hardening.md) |
|
|
150
160
|
| Use public vs internal preview SDK releases | [Release channels](./docs/release.md) |
|
|
151
161
|
| CLI flags + commands | [CLI reference](./docs/reference/cli.md) |
|
|
@@ -81,6 +81,7 @@ Start with [Getting started](./docs/getting-started.md), then [Concepts](./docs/
|
|
|
81
81
|
| Multi-agent: coder + reviewer, simulated user, BYOS, stateful envs | [Use cases](./docs/use-cases.md) |
|
|
82
82
|
| Multi-round single-agent (progressive disclosure, oracle access) | [Progressive disclosure](./docs/progressive-disclosure.md) |
|
|
83
83
|
| Skill evaluation (when the artifact is a skill, not a workspace) | [Skill eval](./docs/skill-eval.md) |
|
|
84
|
+
| Contribute a trajectory capture | [Trajectory upload](./docs/traj-upload.md) |
|
|
84
85
|
| Understand the security model | [Sandbox hardening](./docs/sandbox-hardening.md) |
|
|
85
86
|
| Use public vs internal preview SDK releases | [Release channels](./docs/release.md) |
|
|
86
87
|
| CLI flags + commands | [CLI reference](./docs/reference/cli.md) |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "benchflow"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.9"
|
|
4
4
|
description = "Multi-turn agent benchmarking with ACP — run any agent, any model, any provider."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -40,6 +40,20 @@ classifiers = [
|
|
|
40
40
|
]
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
|
+
azure = [
|
|
44
|
+
# Direct Azure Blob trajectory uploads (bench traj upload --direct).
|
|
45
|
+
# Broker-mode uploads need neither package.
|
|
46
|
+
"azure-storage-blob>=12.19",
|
|
47
|
+
"azure-identity>=1.16",
|
|
48
|
+
]
|
|
49
|
+
azure-service = [
|
|
50
|
+
# Dependencies baked into the public trajectory broker/validator image.
|
|
51
|
+
"azure-storage-blob>=12.19",
|
|
52
|
+
"azure-identity>=1.16",
|
|
53
|
+
"azure-data-tables>=12.5",
|
|
54
|
+
"azure-storage-queue>=12.9",
|
|
55
|
+
"uvicorn>=0.30",
|
|
56
|
+
]
|
|
43
57
|
dev = [
|
|
44
58
|
"pre-commit>=3.7",
|
|
45
59
|
# AgentCore's CodeBuild path must reproduce Docker's ignore rules in tests
|
|
@@ -57,6 +57,7 @@ from benchflow.cli.sandbox import register_sandbox
|
|
|
57
57
|
from benchflow.cli.skills import register_skills
|
|
58
58
|
from benchflow.cli.tasks import register_tasks
|
|
59
59
|
from benchflow.cli.train import register_train
|
|
60
|
+
from benchflow.cli.traj import register_traj
|
|
60
61
|
from benchflow.eval_plan import EvalCreateRequest, EvalPlanError, build_eval_plan
|
|
61
62
|
from benchflow.evaluation import DEFAULT_AGENT, effective_model
|
|
62
63
|
from benchflow.sandbox.providers import providers_phrase
|
|
@@ -1242,6 +1243,7 @@ register_continue(eval_app, alias_app=app)
|
|
|
1242
1243
|
register_skills(app)
|
|
1243
1244
|
register_review(app)
|
|
1244
1245
|
register_tasks(app)
|
|
1246
|
+
register_traj(app)
|
|
1245
1247
|
register_train(app)
|
|
1246
1248
|
register_hub(app)
|
|
1247
1249
|
register_agent(app)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""``bench traj upload`` — contribute validated trajectory captures."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
import typer
|
|
10
|
+
from rich.markup import escape
|
|
11
|
+
|
|
12
|
+
from benchflow.cli._shared import console, print_error
|
|
13
|
+
|
|
14
|
+
# The environment variable remains an override for development and disaster
|
|
15
|
+
# recovery.
|
|
16
|
+
DEFAULT_TRAJ_BROKER_URL: str | None = (
|
|
17
|
+
"https://tasksminer-traj-broker.nicewave-c3abaecf.westus2.azurecontainerapps.io"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def register_traj(app: typer.Typer) -> None:
|
|
22
|
+
"""Attach the trajectory contribution group to the top-level app."""
|
|
23
|
+
traj_app = typer.Typer(help="Trajectory commands.")
|
|
24
|
+
app.add_typer(traj_app, name="traj", rich_help_panel="Core")
|
|
25
|
+
|
|
26
|
+
@traj_app.command("upload")
|
|
27
|
+
def upload(
|
|
28
|
+
path: Annotated[
|
|
29
|
+
Path,
|
|
30
|
+
typer.Argument(help="Trajectory JSONL file, directory, or trial directory"),
|
|
31
|
+
],
|
|
32
|
+
github_id: Annotated[
|
|
33
|
+
str,
|
|
34
|
+
typer.Option("--github-id", help="Contributor GitHub username"),
|
|
35
|
+
],
|
|
36
|
+
email: Annotated[
|
|
37
|
+
str,
|
|
38
|
+
typer.Option("--email", help="Contributor email stored in the manifest"),
|
|
39
|
+
],
|
|
40
|
+
source_id: Annotated[
|
|
41
|
+
str | None,
|
|
42
|
+
typer.Option("--source-id", help="Stable contributor source identifier"),
|
|
43
|
+
] = None,
|
|
44
|
+
direct: Annotated[
|
|
45
|
+
bool,
|
|
46
|
+
typer.Option("--direct", help="Upload with local Azure credentials"),
|
|
47
|
+
] = False,
|
|
48
|
+
container_url: Annotated[
|
|
49
|
+
str | None,
|
|
50
|
+
typer.Option("--container-url", help="Azure container URL for --direct"),
|
|
51
|
+
] = None,
|
|
52
|
+
dry_run: Annotated[
|
|
53
|
+
bool,
|
|
54
|
+
typer.Option("--dry-run", help="Validate and stage without uploading"),
|
|
55
|
+
] = False,
|
|
56
|
+
) -> None:
|
|
57
|
+
"""Validate, redact, and upload trajectory JSONL."""
|
|
58
|
+
from benchflow.publish.azure_blob import upload_capture_direct
|
|
59
|
+
from benchflow.publish.broker import upload_capture_via_broker
|
|
60
|
+
from benchflow.publish.traj_capture import (
|
|
61
|
+
default_source_id,
|
|
62
|
+
stage_trajectory_capture,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
selected_source_id = source_id or default_source_id(path)
|
|
67
|
+
if direct:
|
|
68
|
+
destination = container_url or os.environ.get(
|
|
69
|
+
"BENCHFLOW_AZURE_CONTAINER_URL"
|
|
70
|
+
)
|
|
71
|
+
if not destination:
|
|
72
|
+
raise ValueError(
|
|
73
|
+
"--direct requires --container-url or "
|
|
74
|
+
"BENCHFLOW_AZURE_CONTAINER_URL"
|
|
75
|
+
)
|
|
76
|
+
else:
|
|
77
|
+
if container_url:
|
|
78
|
+
raise ValueError("--container-url is only valid with --direct")
|
|
79
|
+
destination = (
|
|
80
|
+
os.environ.get("BENCHFLOW_TRAJ_BROKER_URL")
|
|
81
|
+
or DEFAULT_TRAJ_BROKER_URL
|
|
82
|
+
)
|
|
83
|
+
if not destination:
|
|
84
|
+
raise ValueError(
|
|
85
|
+
"no trajectory broker is configured; set "
|
|
86
|
+
"BENCHFLOW_TRAJ_BROKER_URL, or use --direct with "
|
|
87
|
+
"--container-url/BENCHFLOW_AZURE_CONTAINER_URL if you have "
|
|
88
|
+
"Azure credentials"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
with stage_trajectory_capture(
|
|
92
|
+
path,
|
|
93
|
+
source_id=selected_source_id,
|
|
94
|
+
uploaded_by=os.environ.get("BENCHFLOW_TRAJ_UPLOADED_BY"),
|
|
95
|
+
github_id=github_id,
|
|
96
|
+
email=email,
|
|
97
|
+
) as staged:
|
|
98
|
+
if dry_run:
|
|
99
|
+
_print_dry_run(staged, destination=destination, direct=direct)
|
|
100
|
+
return
|
|
101
|
+
if direct:
|
|
102
|
+
result = upload_capture_direct(
|
|
103
|
+
staged,
|
|
104
|
+
container_url=destination,
|
|
105
|
+
)
|
|
106
|
+
else:
|
|
107
|
+
result = upload_capture_via_broker(
|
|
108
|
+
staged,
|
|
109
|
+
broker_url=destination,
|
|
110
|
+
)
|
|
111
|
+
size = sum(item.size_bytes for item in staged.files)
|
|
112
|
+
if result.uploaded:
|
|
113
|
+
console.print(
|
|
114
|
+
"[green]Uploaded trajectory:[/green] "
|
|
115
|
+
f"{escape(result.url)} "
|
|
116
|
+
f"({len(result.uploaded)} uploaded, {len(result.skipped)} skipped, "
|
|
117
|
+
f"{_format_bytes(size)}, "
|
|
118
|
+
f"{staged.redaction_replacements} redactions)"
|
|
119
|
+
)
|
|
120
|
+
else:
|
|
121
|
+
console.print(
|
|
122
|
+
f"[green]Already uploaded:[/green] {escape(result.url)} (no-op)"
|
|
123
|
+
)
|
|
124
|
+
except ValueError as exc:
|
|
125
|
+
print_error(str(exc))
|
|
126
|
+
raise typer.Exit(1) from None
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _print_dry_run(staged, *, destination: str, direct: bool) -> None:
|
|
130
|
+
mode = "Azure container" if direct else "broker"
|
|
131
|
+
console.print(f"[bold]Dry run[/bold] — {mode}: {escape(destination)}")
|
|
132
|
+
console.print(f"Digest: sha256:{staged.traj_digest}")
|
|
133
|
+
for staged_file in staged.files:
|
|
134
|
+
console.print(
|
|
135
|
+
f" {escape(staged_file.relname)} ({_format_bytes(staged_file.size_bytes)})"
|
|
136
|
+
)
|
|
137
|
+
if staged.ignored:
|
|
138
|
+
console.print(f"Ignored: {escape(', '.join(staged.ignored))}")
|
|
139
|
+
console.print(f"Redactions: {staged.redaction_replacements}")
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _format_bytes(size: int) -> str:
|
|
143
|
+
value = float(size)
|
|
144
|
+
for unit in ("B", "KB", "MB", "GB"):
|
|
145
|
+
if value < 1024 or unit == "GB":
|
|
146
|
+
return f"{value:.1f} {unit}"
|
|
147
|
+
value /= 1024
|
|
148
|
+
raise AssertionError("unreachable")
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""Direct Azure Blob publishing for staged trajectory captures."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from contextlib import contextmanager
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any
|
|
9
|
+
from urllib.parse import urlparse
|
|
10
|
+
|
|
11
|
+
from benchflow import __version__
|
|
12
|
+
from benchflow.publish.traj_capture import StagedCapture
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class BlobPublishResult:
|
|
17
|
+
account: str
|
|
18
|
+
container: str
|
|
19
|
+
prefix: str
|
|
20
|
+
uploaded: tuple[str, ...]
|
|
21
|
+
skipped: tuple[str, ...]
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def url(self) -> str:
|
|
25
|
+
return (
|
|
26
|
+
f"https://{self.account}.blob.core.windows.net/"
|
|
27
|
+
f"{self.container}/{self.prefix}"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def upload_capture_direct(
|
|
32
|
+
staged: StagedCapture,
|
|
33
|
+
*,
|
|
34
|
+
container_url: str,
|
|
35
|
+
credential: Any = None,
|
|
36
|
+
) -> BlobPublishResult:
|
|
37
|
+
"""Create staged files in an Azure container without overwriting blobs."""
|
|
38
|
+
try:
|
|
39
|
+
from azure.core.exceptions import (
|
|
40
|
+
ClientAuthenticationError,
|
|
41
|
+
HttpResponseError,
|
|
42
|
+
ResourceExistsError,
|
|
43
|
+
ResourceNotFoundError,
|
|
44
|
+
)
|
|
45
|
+
from azure.identity import DefaultAzureCredential
|
|
46
|
+
from azure.storage.blob import ContainerClient, ContentSettings
|
|
47
|
+
except ModuleNotFoundError as exc: # pragma: no cover - environment dependent
|
|
48
|
+
raise ValueError(
|
|
49
|
+
"azure-storage-blob and azure-identity are required for --direct; "
|
|
50
|
+
"install with: pip install 'benchflow[azure]'"
|
|
51
|
+
) from exc
|
|
52
|
+
|
|
53
|
+
with _quiet_azure_request_logging():
|
|
54
|
+
account, container = _parse_container_url(container_url)
|
|
55
|
+
auth = credential if credential is not None else DefaultAzureCredential()
|
|
56
|
+
client = ContainerClient.from_container_url(container_url, credential=auth)
|
|
57
|
+
prefix = f"sources/{staged.source_id}/{staged.traj_digest}/"
|
|
58
|
+
metadata = {
|
|
59
|
+
"source_id": staged.source_id,
|
|
60
|
+
"traj_digest": f"sha256:{staged.traj_digest}",
|
|
61
|
+
"schema_version": str(staged.manifest["schema_version"]),
|
|
62
|
+
"manifest": "manifest.json",
|
|
63
|
+
"benchflow_version": __version__,
|
|
64
|
+
}
|
|
65
|
+
uploaded: list[str] = []
|
|
66
|
+
skipped: list[str] = []
|
|
67
|
+
for staged_file in staged.files:
|
|
68
|
+
blob_name = prefix + staged_file.relname
|
|
69
|
+
try:
|
|
70
|
+
with staged_file.local_path.open("rb") as stream:
|
|
71
|
+
client.upload_blob(
|
|
72
|
+
name=blob_name,
|
|
73
|
+
data=stream,
|
|
74
|
+
overwrite=False,
|
|
75
|
+
content_settings=ContentSettings(
|
|
76
|
+
content_type=staged_file.content_type
|
|
77
|
+
),
|
|
78
|
+
metadata=metadata,
|
|
79
|
+
)
|
|
80
|
+
except ResourceExistsError:
|
|
81
|
+
skipped.append(blob_name)
|
|
82
|
+
except ResourceNotFoundError as exc:
|
|
83
|
+
raise ValueError(
|
|
84
|
+
f"Azure container not found: {container_url}; create the storage "
|
|
85
|
+
"account and private container before using --direct"
|
|
86
|
+
) from exc
|
|
87
|
+
except ClientAuthenticationError as exc:
|
|
88
|
+
raise ValueError(
|
|
89
|
+
"Azure authentication failed; run 'az login' (or configure managed "
|
|
90
|
+
"identity) and grant the Blob Data Creator role"
|
|
91
|
+
) from exc
|
|
92
|
+
except HttpResponseError as exc:
|
|
93
|
+
if getattr(exc, "status_code", None) == 403:
|
|
94
|
+
raise ValueError(
|
|
95
|
+
"Azure upload was forbidden; run 'az login' (or configure "
|
|
96
|
+
"managed identity) and grant the Blob Data Creator role"
|
|
97
|
+
) from exc
|
|
98
|
+
raise ValueError(
|
|
99
|
+
f"Azure Blob upload failed for {blob_name}: {exc}"
|
|
100
|
+
) from exc
|
|
101
|
+
else:
|
|
102
|
+
uploaded.append(blob_name)
|
|
103
|
+
return BlobPublishResult(
|
|
104
|
+
account=account,
|
|
105
|
+
container=container,
|
|
106
|
+
prefix=prefix,
|
|
107
|
+
uploaded=tuple(uploaded),
|
|
108
|
+
skipped=tuple(skipped),
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
@contextmanager
|
|
113
|
+
def _quiet_azure_request_logging():
|
|
114
|
+
"""Keep Azure SDK request diagnostics out of the one-line CLI result."""
|
|
115
|
+
azure_logger = logging.getLogger("azure")
|
|
116
|
+
previous_level = azure_logger.level
|
|
117
|
+
azure_logger.setLevel(logging.WARNING)
|
|
118
|
+
try:
|
|
119
|
+
yield
|
|
120
|
+
finally:
|
|
121
|
+
azure_logger.setLevel(previous_level)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _parse_container_url(container_url: str) -> tuple[str, str]:
|
|
125
|
+
parsed = urlparse(container_url.rstrip("/"))
|
|
126
|
+
host_suffix = ".blob.core.windows.net"
|
|
127
|
+
container = parsed.path.strip("/")
|
|
128
|
+
if (
|
|
129
|
+
parsed.scheme != "https"
|
|
130
|
+
or not parsed.hostname
|
|
131
|
+
or not parsed.hostname.endswith(host_suffix)
|
|
132
|
+
or not container
|
|
133
|
+
or "/" in container
|
|
134
|
+
):
|
|
135
|
+
raise ValueError(
|
|
136
|
+
"--container-url must look like "
|
|
137
|
+
"https://<account>.blob.core.windows.net/<container>"
|
|
138
|
+
)
|
|
139
|
+
account = parsed.hostname[: -len(host_suffix)]
|
|
140
|
+
if not account:
|
|
141
|
+
raise ValueError("--container-url is missing the storage account name")
|
|
142
|
+
return account, container
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""Cloud-neutral client for the public trajectory upload broker."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from contextlib import contextmanager, nullcontext
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any
|
|
9
|
+
from urllib.parse import urlparse
|
|
10
|
+
|
|
11
|
+
import httpx
|
|
12
|
+
|
|
13
|
+
from benchflow.publish.traj_capture import StagedCapture
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class BrokerPublishResult:
|
|
18
|
+
base_url: str
|
|
19
|
+
prefix: str
|
|
20
|
+
uploaded: tuple[str, ...]
|
|
21
|
+
skipped: tuple[str, ...]
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def url(self) -> str:
|
|
25
|
+
return f"{self.base_url.rstrip('/')}/{self.prefix.lstrip('/')}"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def upload_capture_via_broker(
|
|
29
|
+
staged: StagedCapture,
|
|
30
|
+
*,
|
|
31
|
+
broker_url: str,
|
|
32
|
+
http_client: httpx.Client | None = None,
|
|
33
|
+
) -> BrokerPublishResult:
|
|
34
|
+
"""Request scoped upload URLs and PUT every staged file in server order."""
|
|
35
|
+
endpoint = f"{broker_url.rstrip('/')}/v1/uploads"
|
|
36
|
+
artifacts = staged.manifest["artifacts"]
|
|
37
|
+
request_body = {
|
|
38
|
+
"schema_version": staged.manifest["schema_version"],
|
|
39
|
+
"kind": staged.manifest["kind"],
|
|
40
|
+
"source_id": staged.manifest["source_id"],
|
|
41
|
+
"traj_digest": staged.manifest["traj_digest"],
|
|
42
|
+
"uploaded_by": staged.manifest["uploaded_by"],
|
|
43
|
+
"artifacts": artifacts,
|
|
44
|
+
}
|
|
45
|
+
if contributor := staged.manifest.get("contributor"):
|
|
46
|
+
request_body["contributor"] = contributor
|
|
47
|
+
manager = nullcontext(http_client) if http_client is not None else httpx.Client()
|
|
48
|
+
try:
|
|
49
|
+
with _quiet_httpx_request_logging(), manager as client:
|
|
50
|
+
response = client.post(endpoint, json=request_body, timeout=30)
|
|
51
|
+
if response.status_code == 409:
|
|
52
|
+
return _already_uploaded_result(response, staged, broker_url)
|
|
53
|
+
_raise_for_broker_response(response, operation="upload handshake")
|
|
54
|
+
payload = _response_object(response)
|
|
55
|
+
objects = _validated_objects(payload, staged)
|
|
56
|
+
base_url, prefix = _destination(payload)
|
|
57
|
+
|
|
58
|
+
uploaded: list[str] = []
|
|
59
|
+
skipped: list[str] = []
|
|
60
|
+
for staged_file, upload in zip(staged.files, objects, strict=True):
|
|
61
|
+
object_name = prefix + staged_file.relname
|
|
62
|
+
with staged_file.local_path.open("rb") as stream:
|
|
63
|
+
put_response = client.put(
|
|
64
|
+
upload["put_url"],
|
|
65
|
+
headers=upload["headers"],
|
|
66
|
+
content=stream,
|
|
67
|
+
timeout=300,
|
|
68
|
+
)
|
|
69
|
+
if put_response.status_code in {409, 412}:
|
|
70
|
+
skipped.append(object_name)
|
|
71
|
+
continue
|
|
72
|
+
_raise_for_broker_response(
|
|
73
|
+
put_response,
|
|
74
|
+
operation=f"upload of {staged_file.relname}",
|
|
75
|
+
)
|
|
76
|
+
uploaded.append(object_name)
|
|
77
|
+
except httpx.HTTPError as exc:
|
|
78
|
+
raise ValueError(f"trajectory broker request failed: {exc}") from exc
|
|
79
|
+
|
|
80
|
+
return BrokerPublishResult(
|
|
81
|
+
base_url=base_url,
|
|
82
|
+
prefix=prefix,
|
|
83
|
+
uploaded=tuple(uploaded),
|
|
84
|
+
skipped=tuple(skipped),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@contextmanager
|
|
89
|
+
def _quiet_httpx_request_logging():
|
|
90
|
+
"""Keep short-lived signed upload URLs out of the global INFO stream."""
|
|
91
|
+
httpx_logger = logging.getLogger("httpx")
|
|
92
|
+
previous_level = httpx_logger.level
|
|
93
|
+
httpx_logger.setLevel(logging.WARNING)
|
|
94
|
+
try:
|
|
95
|
+
yield
|
|
96
|
+
finally:
|
|
97
|
+
httpx_logger.setLevel(previous_level)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _already_uploaded_result(
|
|
101
|
+
response: httpx.Response,
|
|
102
|
+
staged: StagedCapture,
|
|
103
|
+
broker_url: str,
|
|
104
|
+
) -> BrokerPublishResult:
|
|
105
|
+
try:
|
|
106
|
+
payload = _response_object(response)
|
|
107
|
+
base_url, prefix = _destination(payload)
|
|
108
|
+
except ValueError:
|
|
109
|
+
base_url = broker_url.rstrip("/")
|
|
110
|
+
prefix = f"sources/community/{staged.traj_digest}/"
|
|
111
|
+
return BrokerPublishResult(
|
|
112
|
+
base_url=base_url,
|
|
113
|
+
prefix=prefix,
|
|
114
|
+
uploaded=(),
|
|
115
|
+
skipped=tuple(prefix + item.relname for item in staged.files),
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _response_object(response: httpx.Response) -> dict[str, Any]:
|
|
120
|
+
try:
|
|
121
|
+
payload = response.json()
|
|
122
|
+
except ValueError as exc:
|
|
123
|
+
raise ValueError("trajectory broker returned invalid JSON") from exc
|
|
124
|
+
if not isinstance(payload, dict):
|
|
125
|
+
raise ValueError("trajectory broker returned a non-object response")
|
|
126
|
+
return payload
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _validated_objects(
|
|
130
|
+
payload: dict[str, Any], staged: StagedCapture
|
|
131
|
+
) -> list[dict[str, Any]]:
|
|
132
|
+
objects = payload.get("objects")
|
|
133
|
+
if not isinstance(objects, list) or not all(
|
|
134
|
+
isinstance(item, dict) for item in objects
|
|
135
|
+
):
|
|
136
|
+
raise ValueError("trajectory broker protocol violation: objects must be a list")
|
|
137
|
+
expected_names = [item.relname for item in staged.files]
|
|
138
|
+
names = [item.get("name") for item in objects]
|
|
139
|
+
if names != expected_names:
|
|
140
|
+
raise ValueError(
|
|
141
|
+
"trajectory broker protocol violation: response objects must match "
|
|
142
|
+
"the staged files in canonical manifest-last order"
|
|
143
|
+
)
|
|
144
|
+
for item in objects:
|
|
145
|
+
put_url = item.get("put_url")
|
|
146
|
+
if not isinstance(put_url, str):
|
|
147
|
+
raise ValueError("trajectory broker protocol violation: missing put_url")
|
|
148
|
+
parsed_url = urlparse(put_url)
|
|
149
|
+
if (
|
|
150
|
+
parsed_url.scheme != "https"
|
|
151
|
+
or not parsed_url.hostname
|
|
152
|
+
or parsed_url.username is not None
|
|
153
|
+
or parsed_url.password is not None
|
|
154
|
+
):
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"trajectory broker protocol violation: put_url must be an "
|
|
157
|
+
"authenticated HTTPS URL"
|
|
158
|
+
)
|
|
159
|
+
headers = item.get("headers")
|
|
160
|
+
if not isinstance(headers, dict) or not all(
|
|
161
|
+
isinstance(key, str) and isinstance(value, str)
|
|
162
|
+
for key, value in headers.items()
|
|
163
|
+
):
|
|
164
|
+
raise ValueError(
|
|
165
|
+
"trajectory broker protocol violation: headers must map strings to strings"
|
|
166
|
+
)
|
|
167
|
+
return objects
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def _destination(payload: dict[str, Any]) -> tuple[str, str]:
|
|
171
|
+
prefix = payload.get("prefix")
|
|
172
|
+
if not isinstance(prefix, str) or not prefix:
|
|
173
|
+
raise ValueError("trajectory broker protocol violation: missing prefix")
|
|
174
|
+
base_url = payload.get("base_url")
|
|
175
|
+
if isinstance(base_url, str) and base_url.startswith("https://"):
|
|
176
|
+
return base_url, prefix
|
|
177
|
+
bucket = payload.get("bucket")
|
|
178
|
+
if isinstance(bucket, str) and bucket:
|
|
179
|
+
return f"gs://{bucket}", prefix
|
|
180
|
+
raise ValueError("trajectory broker protocol violation: missing destination")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _raise_for_broker_response(response: httpx.Response, *, operation: str) -> None:
|
|
184
|
+
if response.status_code < 400:
|
|
185
|
+
return
|
|
186
|
+
detail = response.text.strip().replace("\n", " ")[:300]
|
|
187
|
+
if response.status_code == 413:
|
|
188
|
+
raise ValueError(f"trajectory broker rejected an oversized capture: {detail}")
|
|
189
|
+
if response.status_code == 429:
|
|
190
|
+
retry_after = response.headers.get("Retry-After")
|
|
191
|
+
suffix = f"; retry after {retry_after}" if retry_after else ""
|
|
192
|
+
raise ValueError(f"trajectory broker rate limit exceeded{suffix}: {detail}")
|
|
193
|
+
raise ValueError(
|
|
194
|
+
f"trajectory broker {operation} failed with HTTP {response.status_code}: {detail}"
|
|
195
|
+
)
|