ruvnet/ruflo · error · Error

tuneDistillation: every grid candidate was skipped — see…

Error message

tuneDistillation: every grid candidate was skipped — see candidates[].skipped

What it means

Every candidate config in the grid was skipped during evaluation (each candidate record carries a skipped reason), so there are no scored candidates to rank or report. The error points at candidates[].skipped for the per-candidate causes; common triggers are empty train query sets or failed distillation copies.

Solutions

  1. Inspect candidates[].skipped to learn why each candidate was rejected
  2. Loosen skip criteria or supply candidates that satisfy them

Example fix

Inspect the candidates[].skipped reasons in the output, widen the grid ranges or relax constraints, and re-run so at least one candidate is evaluated.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at v3/@claude-flow/cli/src/services/distill-tuning.ts:306 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18). Data as JSON: /api/errors/ea1e4c61423af638. Report an issue: GitHub.

Appendix: source

Thrown at v3/@claude-flow/cli/src/services/distill-tuning.ts:306

      namespaces,
      querySet: trainQuerySet,
      topK,
    });
    candidates.push({
      config,
      trainScore: result.mrrAtK,
      trainRecallAt10: result.recallAtK,
      trainQueryCount: result.queryCount,
      patternCount: result.patternCount,
      promotedCount: result.promotedCount,
      distillMs: result.distillMs,
      ...(result.skipped ? { skipped: result.skipped } : {}),
    });
  }

  const scored = candidates.filter((c) => !c.skipped);
  if (scored.length === 0) {
    throw new Error('tuneDistillation: every grid candidate was skipped — see candidates[].skipped');
  }
  const winner = scored.reduce((best, c) => (c.trainScore > best.trainScore ? c : best), scored[0]);

  // ── Held-out: score the winner ONCE, refit on the FULL outer train partition ──
  const winnerFull = await evaluateCandidate({
    Database,
    sourceDbPath: dbPath,
    tmpDir,
    config: winner.config,
    fitBoundaryRowid: outerSplit.trainBoundaryRowid,
    namespaces,
    querySet: heldOutQuerySet,
    topK,
  });
  const baseline = scoreQuerySet(heldOutBaselineIndex, heldOutQuerySet, topK);

  const heldOut: HeldOutScore = {
    mrrAt10: winnerFull.mrrAtK,

View on GitHub (pinned to fa13ee4ad6)