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
- 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
- A safe, unique --revision is required
- agent_not_found
- ANTHROPIC_API_KEY is required in the CLI process environment
- Anthropic did not return a usable pinned Agent version
- --api-key-env must name a valid environment variable.
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)