Skip to content

Benchmark Suites

Ruhroh benchmark suites are frozen benchmark manifests. They group realistic tasks under a named methodology and governance record so results can be reported against something more stable than an ad hoc filter.

List bundled suites:

bash
pnpm exec ruhroh list-suites
pnpm exec ruhroh list-suites --json

Programmatic consumers can load the bundled pack manifests from the public API:

ts
import {
  getBuiltinRuhrohSuiteById,
  getBuiltinRuhrohSuitesByScenarioId,
  loadBuiltinRuhrohSuites,
  resolveRuhrohBuiltinSuiteDir,
} from "@kestrel-agents/ruhroh";

const suiteDir = resolveRuhrohBuiltinSuiteDir();
const suites = loadBuiltinRuhrohSuites(suiteDir);
const smoke = getBuiltinRuhrohSuiteById("ruhroh-smoke", suiteDir);
const suitesCoveringNewsletter = getBuiltinRuhrohSuitesByScenarioId(
  "simple-newsletter",
  suiteDir,
);

Generate a suite:

bash
pnpm exec ruhroh generate --suite ruhroh-smoke

Run or dry-run a benchmark suite with an agent connector:

bash
pnpm exec ruhroh run --suite ruhroh-productivity --adapter ./path/to/agent-wrapper.sh --dry-run

Validate benchmark-suite membership and referenced tasks:

bash
pnpm exec ruhroh validate --suite ruhroh-data-apps
pnpm exec ruhroh validate --suite ruhroh-data-apps --json

Check local benchmark-suite readiness alongside agent/reviewer wiring:

bash
pnpm exec ruhroh doctor --scenario-dir ruhroh/scenarios --suite-dir ruhroh/suites --suite local-smoke --adapter ./adapters/my-agent.sh

Create a local benchmark suite from authored tasks:

bash
pnpm exec ruhroh new-suite local-data \
  --scenario-dir ruhroh/scenarios \
  --suite-dir ruhroh/suites \
  --scenario csv-cleanup \
  --scenario shift-review \
  --runs 10
pnpm exec ruhroh validate --scenario-dir ruhroh/scenarios --suite-dir ruhroh/suites --suite local-data

new-suite reads each selected task, freezes its metadata.scenarioVersion in the benchmark-suite manifest, and writes methodology plus governance defaults for repeatable comparisons. Review the description, acceptance criteria, contamination review, reward-hacking review, review checklist, and deprecation policy before publishing the benchmark suite.

Built-In Benchmark Suites

  • ruhroh-smoke: one small local-app task for install validation and connector bring-up.
  • ruhroh-productivity: stateful productivity app workflows such as budget planning, sprint planning, and task boards.
  • ruhroh-data-apps: local app tasks that involve structured data assets, reconciliation, scheduling, review state, and export behavior.
  • ruhroh-maintenance: larger stateful app tasks that stress continuation, repair, and post-failure diagnosis.

Manifest Contract

Suite manifests live at:

text
suites/<suite-id>/suite.json

They use version: "ruhroh_suite_v1" and include:

  • id, title, suiteVersion, and description;
  • ordered scenarioIds;
  • scenarioVersions, mapping every task id to the task metadata version frozen by this benchmark-suite version;
  • methodology fields: minRuns, aggregationUnit, reportPolicy, confidenceLevel, and retryPolicy;
  • governance fields: owner, changelog, acceptance criteria, contamination review, reward-hacking review, review checklist, and deprecation policy.

The package ships a structural JSON Schema at node_modules/@kestrel-agents/ruhroh/schemas/suite-v1.schema.json; ruhroh init also copies it to ruhroh/schemas/suite-v1.schema.json. Use it for editor completion or CI shape checks before running ruhroh validate, which adds task existence, task-version lock, and governance validation.

Published benchmark-suite changes should bump suiteVersion whenever task membership, locked task versions, assets, prompts, or acceptance criteria change. ruhroh validate --suite <id> checks the benchmark-suite locks against the current task metadata when both trees are available. Validation requires non-empty contamination review, reward-hacking review, review checklist, and deprecation policy fields so a benchmark pack cannot be published without recording its adversarial-review and lifecycle controls.

Benchmark Suite Versioning

Treat suiteVersion as the benchmark methodology version. It is the version a claim cites when it says "these runs were collected against this benchmark suite."

Bump suiteVersion when you:

  • add, remove, reorder, or replace tasks;
  • move a suite lock to a new metadata.scenarioVersion;
  • change methodology.minRuns, retry policy, aggregation unit, or report policy;
  • change acceptance criteria, contamination review, reward-hacking review, review checklist, or deprecation policy in a way that affects publication readiness;
  • change private reviewer files or calibration expectations for tasks in the benchmark suite.

You do not need a suite bump for typo fixes, owner/contact updates, or non-semantic wording changes that do not affect task locks, methodology, or governance decisions. Still add a changelog note when the suite is public so reviewers can distinguish harmless metadata maintenance from benchmark drift.

Before publishing results for a changed benchmark suite:

  1. Update suiteVersion and the suite changelog.
  2. Re-run ruhroh validate --scenario-dir <dir> --suite-dir <dir> --suite <id>.
  3. Re-run ruhroh inspect-pack --require-calibrated --require-risk-reviewed.
  4. Generate a new run plan for the changed suite version.
  5. Collect a fresh cohort; do not mix results from old and new benchmark-suite versions in one published claim.
  6. Run ruhroh publish-check --suite <id> --run-plan <plan> --bundle <dir> --verify-sources and archive the bundle.

Old claims remain inspectable if their publication packet keeps the old benchmark-suite manifest, task version locks, run plan, source hashes, and saved results. They should not be silently reinterpreted as results for the newer benchmark suite.

Methodology

Ruhroh compares runs by task and agent connector. A benchmark suite should define the minimum sample size needed before its pass-rate summary is treated as more than directional. Bundled suites use at least five runs for smoke checks and ten runs for broader comparisons.

The standard report policy is:

  • pass rate by task and agent connector;
  • Wilson 95% confidence interval;
  • pass@k for repeated runs;
  • mean score with deterministic bootstrap percentile 95% confidence interval, plus mean subscores;
  • optional cost and token summaries from run manifests;
  • failure buckets and saved evidence links.

Use ruhroh compare ./results --suite <suite-id> for benchmark-suite claims. The suite option filters the result set to benchmark-suite members, reports benchmark-suite metadata, warns when member tasks are missing, applies methodology.minRuns, and checks aggregate task-version cohorts against the suite's scenarioVersions locks. See Task Versioning before moving a benchmark suite to a new task version.

Task-set compares include an agent-level rollup in suiteAdapterSummaries. Use that rollup for high-level claims, but keep the per-task groups in the report so differences can be debugged. The rollup reports run-weighted pass rate, Wilson CI, mean task pass rate, missing tasks, per-task run counts, and whether every task reached the benchmark suite's minimum run count.

Suite compares also include claimReadiness. Treat claimReadiness.publishable: false as a stop sign for public claims; its blockers explain missing scenario coverage, unsatisfied min-run requirements, statistical warnings, or required human review.

Do not retry ordinary agent failures inside a sample. Retry only when the run manifest and artifacts show an external infrastructure failure.

For the full reporting and reviewer-governance rules, see Benchmark Methodology.