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
- List the available rosters in the rosters directory and correct the selection to an exact rosterId or rosterFile path.
- If a file path selection, use the path relative to programRoot with forward slashes.
- 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
- Use tab-completion or a --list-rosters flag instead of typing roster IDs from memory.
- Grep the rosters directory for the exact ID before adding it to CI config.
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
- Managed installs require Node.js ${MINIMUM_NODE_VERSION} or
- Import cancelled.
- Could not open your browser automatically. Open this URL man
- Unknown config key ${warning.path}; did you mean ${warning.s
- SSH fixture prerequisites are incomplete: ${status.ssh.reaso
AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10).
Data as JSON: /api/errors/f0e858bca9c23913.
Report an issue: GitHub.