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
- List each node explicitly with no empty entries, e.g. --nodes n1,n2,n3
- Filter empty values when constructing the list dynamically before passing it to --nodes
- 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
- Build node lists by filtering empties before joining with commas
- Avoid leading, trailing, and double commas in --nodes values
- Unit-test dynamic list construction against the dense-list guard
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
- ${option} is required exactly once for live node qualificati
- ${option} requires a non-empty value for live node qualifica
- Live node qualification requires --live-sixtytwo exactly onc
- Live node qualification requires ITO_ENABLE_SIXTYTWO_LIVE=1
- Unknown argument: ${arg}
AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13).
Data as JSON: /api/errors/8e4f920018bbd37f.
Report an issue: GitHub.