paperclipai/paperclip · error · Error

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

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.

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)

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.