n8n-io/n8n · error · Error

No valid checks after filtering. Requested: ${options.checks

Error message

No valid checks after filtering. Requested: ${options.checks.join(', ')}. Available: ${allCheckNames.join(', ')}

What it means

The binary-checks evaluator filters its catalog (`DETERMINISTIC_CHECKS` plus `LLM_CHECKS` when an LLM is supplied) by the `--checks` option. Unrecognized names only produce `console.warn`, but if NONE of the requested names match the available catalog, the evaluator refuses to build rather than silently run zero checks. The error lists both what you asked for and what is available.

Source

Thrown at packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/index.ts:44

): Evaluator<EvaluationContext> {
	const allChecks: BinaryCheck[] = [...DETERMINISTIC_CHECKS, ...(options.llm ? LLM_CHECKS : [])];

	const allCheckNames = allChecks.map((c) => c.name);

	let selectedChecks: BinaryCheck[];

	if (options.checks && options.checks.length > 0) {
		const validNames = new Set(allCheckNames);
		const unrecognized = options.checks.filter((name) => !validNames.has(name));

		for (const name of unrecognized) {
			console.warn(`Warning: unrecognized check name "${name}" in --checks filter`);
		}

		selectedChecks = allChecks.filter((c) => options.checks!.includes(c.name));

		if (selectedChecks.length === 0) {
			throw new Error(
				`No valid checks after filtering. Requested: ${options.checks.join(', ')}. Available: ${allCheckNames.join(', ')}`,
			);
		}
	} else {
		selectedChecks = allChecks;
	}

	return {
		name: EVALUATOR_NAME,

		async evaluate(workflow: SimpleWorkflow, ctx: EvaluationContext): Promise<Feedback[]> {
			const checkCtx: BinaryCheckContext = {
				prompt: ctx.prompt,
				nodeTypes: options.nodeTypes,
				annotations: ctx.annotations,
				llm: options.llm,
				// Intentionally omit llmCallLimiter: binary-checks LLM judges are small,
				// cheap calls that should run in parallel, not throttled by the shared limiter.

View on GitHub (pinned to 5ac6606e81)

Solutions

  1. Re-run without `--checks` to see the full available set, or read the 'Available:' list in the error message and align your flags to it.
  2. If you requested an LLM check, ensure the judge LLM is configured so `LLM_CHECKS` are part of the catalog.
  3. If a check was renamed, update your script/CI to the new name.

Example fix

// before
createBinaryChecksEvaluator({ nodeTypes, checks: ['valid-json', 'no-unconnected-nodes'] }); // 'valid-json' not a real check
// after
createBinaryChecksEvaluator({ nodeTypes, checks: ['valid-connections', 'no-unconnected-nodes'] }); // names from allCheckNames
Defensive patterns

Strategy: validation

Validate before calling

import { DETERMINISTIC_CHECKS, LLM_CHECKS } from './checks';

function selectChecks(requested: string[] | undefined, hasLlm: boolean): string[] {
  const catalog = new Set([...DETERMINISTIC_CHECKS, ...(hasLlm ? LLM_CHECKS : [])].map((c) => c.name));
  if (!requested || requested.length === 0) return [...catalog];
  const unknown = requested.filter((r) => !catalog.has(r));
  if (unknown.length) console.warn('unknown checks:', unknown.join(', '));
  const selected = requested.filter((r) => catalog.has(r));
  if (selected.length === 0) throw new Error(`no valid checks; available: ${[...catalog].join(', ')}`);
  return selected;
}
// use selected instead of passing --checks blindly

Prevention

When it happens

Trigger: Passing `--checks typo-name` or `--checks llm-only-check` while no `--judge-llm` / LLM is configured (LLM-only checks are not in the catalog without a model). Also: requesting a check that was renamed/removed in a newer version.

Common situations: Copy-pasting a checks list from docs that are out of sync with the installed version; enabling a check name from memory; or expecting an LLM-driven check to be available without supplying an LLM.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/5152c621b9c58130. Report an issue: GitHub.