Skip to main content

Overview

CloudOpsBench is a 452-scenario Kubernetes root-cause-analysis benchmark published by Wang et al (arXiv:2603.00468v1, Feb 2026). The paper uses a State Snapshot paradigm — each fault case is a frozen JSON repository served via mocked kubectl-style tool calls — so every evaluation is bit-for-bit reproducible and needs no live cluster. OpenSRE wraps this corpus through a small reusable benchmark framework that adds cost tracking, integrity guards (pre-registration, per-stratum reporting, negative results, COI disclosure), per-LLM dispatch with version pinning, and self-contained markdown + HTML reports. The goal is to publish the opensre+LLM column against the paper’s LLM-alone baselines on the same scenarios.

What you need to run it

CloudOpsBench needs no live infrastructure. The frozen snapshots are the environment.
You do not need: AWS credentials, an EKS cluster, kind/minikube, Bedrock, GPU, Grafana, Datadog, or Prometheus.

Quick start

List adapters

Validate a config

The config lint catches anti-patterns (runs_per_case < 3, missing pre_registration_path, oversized grids, system-path output_dir). Validation returns non-zero on any failure.

Dev-mode run

--dev skips the integrity gates so you can smoke-test the wiring without writing a pre-registration file. The run ID gets a dev- prefix so dev results can’t be silently promoted.

Production run

A production run requires:
  • A pre-registration YAML at pre_registration_path listing per-model expected deltas, committed to git before the run starts (integrity Mechanism 1)
  • seed: set in config (Mechanism 6)
  • Adapter declaration of data_contamination_checked = True (Mechanism 7)
  • At least one validity metric declared by the adapter (Mechanism 3)
On completion, the run directory contains report.json (machine-readable), report.md (human-readable summary), report.html (self-contained, no external CSS/JS), and cases/*.json (per-cell artifacts).

Re-render an existing report

Config reference

Env-var overrides for CI

These let CI override knobs without editing the YAML:
VariablePurpose
OPENSRE_BENCH_WORKERSOverride workers:
OPENSRE_BENCH_COST_BUDGET_USDOverride cost_budget_usd:

Integrity guarantees

The framework enforces 11 honest-results mechanisms at the code level. There is no bypass short of editing the framework itself.

Pre-flight (before any case runs)

IntegrityGuard.pre_flight raises IntegrityViolation if any of these hold:
  • M1 — Pre-registration: pre_registration_path unset, missing, or empty. Forces the engineer to commit expected deltas before seeing results.
  • M3 — Validity metrics: adapter declares no validity metric (no Streetlight Effect).
  • M6 — Seeded selection: seed: is None (no cherry-picking).
  • M7 — Contamination check: adapter has not declared data_contamination_checked = True.
All violations surface in a single exception so the engineer fixes everything in one pass, not one-fix-rerun-discover-next.

Report-validation (before the report is emitted)

IntegrityGuard.report_validation refuses to publish a report if:
  • M3 — Not every adapter-declared metric is in the report
  • M4 — Per-stratum breakdown missing or contains only all (no aggregate-only reporting)
  • M5 — Raw per-case artifacts directory missing
  • M9negative_results is empty
  • M10coi_disclosure is empty
  • M1 — Pre-registration path not carried into the report

Two more mechanisms are operational, not code-enforced

  • M8 — External replication of ≥1 cell by a third party before public claim
  • M11 — Blinded LLM-as-judge calibration (BDIL Phase B; tracked separately)

Cost tracking

The framework registers a usage hook on core/llm/transports/sdk/llm_clients.py’s LLMClient, OpenAILLMClient, and BedrockLLMClient. Every successful LLM call feeds (model, tokens_in, tokens_out) into a CostTracker. The tracker enforces the configured cost_budget_usd as a hard cap — the next call that would exceed budget raises CostBudgetExceeded and the runner halts cleanly with a partial-completion report. Per-cell tokens_in / tokens_out / cost_usd is currently 0 (aggregate cost is correct; per-cell delta capture is a follow-up). Total run cost in report.json is honest.

Metrics

Paper’s 13 deterministic metrics plus 3 framework-added validity metrics:
FamilyMetricSource
Outcomea1, a3, tcr, exact, in_order, any_orderPaper § 4.2.1
Process — alignmentrel, covPaper § 4.2.2
Process — efficiencysteps, mttiPaper § 4.2.2
Process — robustnessiac, rar, ztdrPaper § 4.2.2
Validitycitation_grounding_rate, entity_existence_rate, kubectl_actionability_rateFramework (regex + universe check)
All 16 metrics are deterministic (string / set comparison) — no LLM-as-judge at evaluation time.

Existing production entry points

make test-cloudopsbench and opensre tests cloudopsbench route through tests/benchmarks/cloudopsbench/run_suite.py, which is the legacy imperative-CLI surface. The framework runner is the new YAML-config surface and coexists with it during the transition. Both call into the same adapter, scoring code, and replay backend.

Reference