paperclipai/paperclip · error · Error

Missing live candidate for ${profile}

Error message

Missing live candidate for ${profile}

What it means

For each selected profile the script resolves a live candidate via liveCandidate(profile, RUNNER_LIVE_CANDIDATE_SLOTS). If no candidate matches the profile's qualification slot, it throws this error naming the profile. This means the profile cannot be run live because no configured candidate supports it.

Source

Thrown at packages/paperclip-runner/scripts/run-local-provider-smoke.mjs:251

let failed = false;
try {
  // Import only after the disposable homes are authoritative so no provider
  // module can snapshot the developer's normal Paperclip or provider state.
  const {
    RUNNER_LIVE_CANDIDATE_SLOTS,
    executeLiveRunnerWorkflow,
    runnerWorkflowCase,
  } = await import("../dist/eval/index.js");
  const candidates = new Map(
    profiles.map((profile) => [
      profile,
      liveCandidate(profile, RUNNER_LIVE_CANDIDATE_SLOTS),
    ]),
  );
  const credentialsByProfile = new Map();
  for (const [profile, candidate] of candidates) {
    if (!candidate) throw new Error(`Missing live candidate for ${profile}`);
    const missingCredentials = [];
    const profileCredentials = {};
    for (const name of candidate.qualification.requiredEnvironment) {
      const value = ambientEnvironment[name]?.trim();
      if (value) profileCredentials[name] = value;
      else missingCredentials.push(name);
    }
    if (missingCredentials.length > 0) {
      throw new Error(
        `${profile} requires ${missingCredentials.join(", ")} in the smoke process environment`,
      );
    }
    credentialsByProfile.set(profile, profileCredentials);
  }
  const providerCredentialNames = new Set(
    [...credentialsByProfile.values()].flatMap((credentials) =>
      Object.keys(credentials),
    ),

View on GitHub (pinned to 01ad858492)

Solutions

  1. Check RUNNER_LIVE_CANDIDATE_SLOTS in run-local-provider-smoke.mjs for the profile id and add/register a matching candidate slot if missing.
  2. Run a different profile that has a registered live candidate (e.g. runner-acpx-claude).
  3. If the profile id was renamed, update the slots map to use the new id.

Example fix

// before
RUNNER_LIVE_CANDIDATE_SLOTS = [{ profiles: ["runner-acpx-claude"], ... }]
// after
RUNNER_LIVE_CANDIDATE_SLOTS = [{ profiles: ["runner-acpx-claude", "runner-new"], ... }]
Defensive patterns

Strategy: validation

Validate before calling

const slots = require('./run-local-provider-smoke.mjs'); // or read source
if (!RUNNER_LIVE_CANDIDATE_SLOTS.some(s => s.profiles.includes(profile))) console.warn(`no live candidate for ${profile}`);

Prevention

When it happens

Trigger: Selecting a profile whose id has no entry in RUNNER_LIVE_CANDIDATE_SLOTS (or all entries fail liveCandidate's slot matching), e.g. a newly added profile in PROFILE_IDS without a corresponding live candidate slot.

Common situations: Adding a new smoke profile without registering its live candidate, or profile-id renames that left the slots map stale.

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


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