affaan-m/ECC · error

--nodes must explicitly list one or more non-empty nodes.

Error message

--nodes must explicitly list one or more non-empty nodes.

What it means

The --nodes value is a comma-separated list, and every entry must be non-empty after trimming. The validator splits on ',' and checks each element; an empty element (a leading/trailing comma or a double comma) is rejected so that no blank node slips through to live qualification.

Source

Thrown at scripts/ito.js:120

  }
  return value;
}

function validateNodeQualificationArgs(args, environment) {
  if (environment.ITO_ENABLE_SIXTYTWO_LIVE !== "1") {
    throw new Error(
      "Live node qualification requires ITO_ENABLE_SIXTYTWO_LIVE=1 before any process is started."
    );
  }
  if (args.filter((value) => value === "--live-sixtytwo").length !== 1) {
    throw new Error(
      "Live node qualification requires --live-sixtytwo exactly once before any process is started."
    );
  }
  requiredOptionValue(args, "--cluster");
  const nodes = requiredOptionValue(args, "--nodes");
  if (!nodes.split(",").every((node) => node.trim().length > 0)) {
    throw new Error("--nodes must explicitly list one or more non-empty nodes.");
  }
  const configDirectory = requiredOptionValue(args, "--config-dir");
  if (!path.isAbsolute(configDirectory)) {
    throw new Error("--config-dir must be an existing absolute directory.");
  }
  try {
    const resolved = fs.realpathSync.native(configDirectory);
    if (
      !fs.statSync(resolved).isDirectory()
      || !fs.statSync(path.join(resolved, "sixtytwo.yaml")).isFile()
    ) {
      throw new Error("invalid qualification configuration");
    }
  } catch {
    throw new Error(
      "--config-dir must exist and contain a regular sixtytwo.yaml before any process is started."
    );
  }

View on GitHub (pinned to 01e15490f0)

Solutions

  1. List each node explicitly with no empty entries, e.g. --nodes n1,n2,n3
  2. Filter empty values when constructing the list dynamically before passing it to --nodes
  3. Validate the list with a quick check: echo "$LIST" | tr ',' '\n' | grep -q '^ *$' && echo empty-entry

Example fix

// before
--nodes n1,,n2
// after
--nodes n1,n2
Defensive patterns

Strategy: validation

Validate before calling

function assertNodesList(nodes) {
  const parts = String(nodes).split(',');
  if (parts.length === 0 || !parts.every(n => n.trim().length > 0)) {
    throw new Error('--nodes contains an empty entry');
  }
}
const i = args.indexOf('--nodes');
if (i !== -1) assertNodesList(args[i + 1]);

Type guard

function isDenseNodeList(nodes) {
  if (typeof nodes !== 'string') return false;
  const parts = nodes.split(',');
  return parts.length > 0 && parts.every(n => n.trim().length > 0);
}

Try / catch

try { validateNodeQualificationArgs(args, env); }
catch (err) {
  if (/--nodes must explicitly list/.test(err.message)) {
    console.error(err.message);
    process.exit(2);
  }
  throw err;
}

Prevention

When it happens

Trigger: Passing --nodes n1,,n2 (double comma), --nodes ,n1 (leading comma), --nodes n1, (trailing comma), or --nodes ',' (only separators).

Common situations: Building the node list dynamically and joining with a comma when one source is empty, or a copy-paste that leaves a stray comma.

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/8e4f920018bbd37f. Report an issue: GitHub.