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

  1. Broaden the filters: drop candidateIds or caseIds until the intersection is non-empty.
  2. Verify the pair (candidateId, caseId) actually exists in schedule.entries before restricting both.
  3. Check the schedule was generated/populated (schedule.entries.length > 0) and regenerate if empty.
  4. 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

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


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/fa02e4385dec9e00. Report an issue: GitHub.