{"record":{"id":"f0e858bca9c23913","repo":"paperclipai/paperclip","slug":"unknown-live-roster-selection-missing-join","errorCode":null,"errorMessage":"Unknown live roster selection: ${missing.join(\", \")}","messagePattern":"Unknown live roster selection: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/scripts/runner-protocol-eval-campaign.mjs","lineNumber":183,"sourceCode":"    }\n    rosters.push({\n      rosterId,\n      rosterFile,\n      configFile: relative(programRoot, configPath).split(sep).join(\"/\"),\n      model: String(roster.model ?? config.model ?? \"unknown\"),\n      provider: String(config.provider ?? \"codex\"),\n      driver: String(config.driver ?? \"codex_app_server\"),\n      credentialName,\n      cases,\n    });\n  }\n  if (selected) {\n    const found = new Set(\n      rosters.flatMap((roster) => [roster.rosterId, roster.rosterFile]),\n    );\n    const missing = [...selected].filter((entry) => !found.has(entry));\n    if (missing.length > 0) {\n      throw new Error(`Unknown live roster selection: ${missing.join(\", \")}`);\n    }\n  }\n  if (rosters.length === 0) throw new Error(\"No live rosters were selected\");\n\n  const cells = rosters.flatMap((roster) =>\n    roster.cases.map((caseId) => ({\n      cellId: safeId(`${roster.rosterId}--${caseId}`, \"cell ID\"),\n      rosterId: roster.rosterId,\n      rosterFile: roster.rosterFile,\n      caseId,\n      model: roster.model,\n      provider: roster.provider,\n      driver: roster.driver,\n      credentialName: roster.credentialName,\n    })),\n  );\n  const shards = [[], []];\n  cells.forEach((cell, index) => shards[index % shards.length].push(cell));","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/scripts/runner-protocol-eval-campaign.mjs#L165-L201","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nnode runner-protocol-eval-campaign.mjs --roster live-rostres/basic.json\n// after\nnode runner-protocol-eval-campaign.mjs --roster live-rosters/basic.json","handlingStrategy":"validation","validationCode":"const available = rosters.map((r) => r.rosterId);\nfor (const sel of selectedEntries) {\n  if (!available.includes(sel)) {\n    console.error(`Unknown roster: ${sel}. Available: ${available.join(\", \")}`);\n    process.exit(1);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  await buildCatalog({ selected });\n} catch (err) {\n  if (String(err.message).startsWith(\"Unknown live roster selection\")) {\n    console.error(err.message, \"\\nRun with --list-rosters to see valid IDs\");\n    process.exit(2);\n  }\n  throw err;\n}","preventionTips":["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."],"tags":["cli","not-found","selection"],"backgroundTag":"resource-not-found","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}