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
- Inspect candidates[].skipped to learn why each candidate was rejected
- 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)