paperclipai/paperclip · error
Runner live eval selection matched no scheduled executions
Error message
Runner live eval selection matched no scheduled executions
What it means
After applying candidateIds, caseIds, and limit filters to the schedule's entries, selectRunnerLiveEvalSchedule requires at least one scheduled execution to remain. If the filtered list is empty it throws, since a selection that matches nothing cannot produce a meaningful live eval run.
Source
Thrown at packages/paperclip-runner/src/eval/live-workflow-matrix.ts:292
}
}
if (
selection.limit !== undefined &&
(!Number.isSafeInteger(selection.limit) || selection.limit <= 0)
) {
throw new Error(
"Runner live eval selection limit must be a positive integer",
);
}
let entries = schedule.entries.filter(
(entry) =>
(candidateIds.size === 0 || candidateIds.has(entry.candidateId)) &&
(caseIds.size === 0 || caseIds.has(entry.caseId)),
);
if (selection.limit !== undefined)
entries = entries.slice(0, selection.limit);
if (entries.length === 0) {
throw new Error(
"Runner live eval selection matched no scheduled executions",
);
}
const selectedCandidateIds = new Set(
entries.map((entry) => entry.candidateId),
);
return {
...schedule,
candidates: schedule.candidates.filter((candidate) =>
selectedCandidateIds.has(candidate.id),
),
entries,
expectedExecutions: entries.length,
};
}
export function assertRunnerLiveCandidateManifest(): void {
const slots = RUNNER_LIVE_CANDIDATE_SLOTS.map((slot) => slot.id);View on GitHub (pinned to 01ad858492)
Solutions
- Broaden the filters: drop candidateIds or caseIds until the intersection is non-empty.
- Verify the pair (candidateId, caseId) actually exists in schedule.entries before restricting both.
- Check the schedule was generated/populated (schedule.entries.length > 0) and regenerate if empty.
- Pre-compute the filtered entries yourself and warn before calling the selector.
Example fix
// before
selectRunnerLiveEvalSchedule(schedule, { candidateIds: ['a'], caseIds: ['case-x'] }); // no such pairing
// after
const hasPair = schedule.entries.some((e) => e.candidateId === 'a' && e.caseId === 'case-x');
if (hasPair) selectRunnerLiveEvalSchedule(schedule, { candidateIds: ['a'], caseIds: ['case-x'] });
else selectRunnerLiveEvalSchedule(schedule, { candidateIds: ['a'] }); Defensive patterns
Strategy: validation
Validate before calling
const filtered = schedule.entries.filter((e) =>
((selection.candidateIds ?? []).length === 0 || (selection.candidateIds ?? []).includes(e.candidateId)) &&
((selection.caseIds ?? []).length === 0 || (selection.caseIds ?? []).includes(e.caseId)));
if (filtered.length === 0) throw new Error('selection would match no scheduled executions; widen filters'); Try / catch
try {
const plan = selectRunnerLiveEvalSchedule(schedule, selection);
} catch (err) {
if ((err as Error).message === 'Runner live eval selection matched no scheduled executions') {
logger.warn('selection empty; falling back to full schedule');
return selectRunnerLiveEvalSchedule(schedule, {});
}
throw err;
} Prevention
- Check candidate/case pairing exists in entries before applying both filters.
- Confirm the schedule actually has entries (entries.length > 0) before selecting.
- Regenerate stale schedules after matrix changes.
- Fall back to an unfiltered selection with a warning instead of failing the whole pipeline.
When it happens
Trigger: Combining candidateIds and caseIds filters that no single entry satisfies (candidate and case never paired together), or a limit of 0 is impossible (guarded earlier) but a narrow filter on a schedule with no overlapping entries, or the schedule itself has no entries.
Common situations: Selecting a specific case for a candidate that schedules a disjoint set of cases; a regenerated schedule whose entries changed while the selection config did not; running the selection against an empty or freshly scaffolded schedule.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- unknown Runner live eval candidate: ${id}
- unknown Runner live eval case: ${id}
- Runner live eval selection limit must be a positive integer
- PAPERCLIP_EVAL_MAX_CAMPAIGN_COST_USD must be a positive fini
- Runner live rotation requires a valid generated-at time
AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10).
Data as JSON: /api/errors/fa02e4385dec9e00.
Report an issue: GitHub.