paperclipai/paperclip · error · Error

No live rosters were selected

Error message

No live rosters were selected

What it means

After optional selection filtering, buildProtocolEvalCatalog asserts that at least one roster survived. If the rosters array is empty (no roster files found, or a selection filtered everything out), there is nothing to build a campaign from, so it throws.

Source

Thrown at packages/paperclip-runner/scripts/runner-protocol-eval-campaign.mjs:186

      rosterFile,
      configFile: relative(programRoot, configPath).split(sep).join("/"),
      model: String(roster.model ?? config.model ?? "unknown"),
      provider: String(config.provider ?? "codex"),
      driver: String(config.driver ?? "codex_app_server"),
      credentialName,
      cases,
    });
  }
  if (selected) {
    const found = new Set(
      rosters.flatMap((roster) => [roster.rosterId, roster.rosterFile]),
    );
    const missing = [...selected].filter((entry) => !found.has(entry));
    if (missing.length > 0) {
      throw new Error(`Unknown live roster selection: ${missing.join(", ")}`);
    }
  }
  if (rosters.length === 0) throw new Error("No live rosters were selected");

  const cells = rosters.flatMap((roster) =>
    roster.cases.map((caseId) => ({
      cellId: safeId(`${roster.rosterId}--${caseId}`, "cell ID"),
      rosterId: roster.rosterId,
      rosterFile: roster.rosterFile,
      caseId,
      model: roster.model,
      provider: roster.provider,
      driver: roster.driver,
      credentialName: roster.credentialName,
    })),
  );
  const shards = [[], []];
  cells.forEach((cell, index) => shards[index % shards.length].push(cell));
  if (shards.some((shard) => shard.length > 256)) {
    throw new Error(
      "Protocol eval catalog exceeds the two-shard GitHub matrix limit",

View on GitHub (pinned to 01ad858492)

Solutions

  1. Run from the correct program root where the rosters directory exists and is populated.
  2. Remove or correct the roster selection so at least one roster is included.
  3. Add roster files if the directory is genuinely empty.

Example fix

// before
node runner-protocol-eval-campaign.mjs --roster nonexistent-roster
// after
node runner-protocol-eval-campaign.mjs  # or select an existing roster id
Defensive patterns

Strategy: validation

Validate before calling

if (rosters.length === 0) {
  console.error("No live rosters found; check program root and rosters directory");
  process.exit(1);
}

Try / catch

try {
  const catalog = await buildProtocolEvalCatalog(args);
} catch (err) {
  if (err.message === "No live rosters were selected") {
    console.error("Check cwd and roster selection flags");
    process.exit(1);
  }
  throw err;
}

Prevention

When it happens

Trigger: Running the campaign script against a program root whose rosters directory contains no valid live-roster/v1 files, or supplying a 'selected' filter whose entries match no rosters (leaving zero after filtering).

Common situations: Running the script from the wrong working directory so no roster files are discovered; a selection string that skips the only available roster; an empty/renamed rosters directory in CI.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/69e49f4177347fd1. Report an issue: GitHub.