paperclipai/paperclip · error · Error

Unknown live roster selection

Error message

Unknown live roster selection: ${missing.join(", ")}

What it means

When a roster selection is provided, buildProtocolEvalCatalog collects all known roster IDs and roster file paths and verifies every requested selection matches one of them. Any selection that matches neither a rosterId nor a rosterFile path is reported as unknown and the catalog build aborts.

Solutions

  1. List the available rosters in the rosters directory and correct the selection to an exact rosterId or rosterFile path.
  2. If a file path selection, use the path relative to programRoot with forward slashes.
  3. Check for renames in git history and update the selection accordingly.

Example fix

// before
node runner-protocol-eval-campaign.mjs --roster live-rostres/basic.json
// after
node runner-protocol-eval-campaign.mjs --roster live-rosters/basic.json
Defensive patterns

Strategy: validation

Validate before calling

const available = rosters.map((r) => r.rosterId);
for (const sel of selectedEntries) {
  if (!available.includes(sel)) {
    console.error(`Unknown roster: ${sel}. Available: ${available.join(", ")}`);
    process.exit(1);
  }
}

Try / catch

try {
  await buildCatalog({ selected });
} catch (err) {
  if (String(err.message).startsWith("Unknown live roster selection")) {
    console.error(err.message, "\nRun with --list-rosters to see valid IDs");
    process.exit(2);
  }
  throw err;
}

Prevention

When it happens

Trigger: Passing a --roster/selection value (e.g. via CLI flags) that is neither an existing roster ID (rosterId) nor a valid roster file path present under the rosters directory; typos in the selection, or referencing a roster that was deleted or renamed.

Common situations: Typo in the roster name ('live-basic' vs 'basic-live'); referencing a roster from another branch; passing a file path with the wrong directory prefix or OS separators; stale CI matrix configuration after rosters were renamed.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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

Appendix: source

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

    }
    rosters.push({
      rosterId,
      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));

View on GitHub (pinned to 01ad858492)