affaan-m/ECC · error · Error

--config-dir must exist and contain a regular sixtytwo.yaml…

Error message

--config-dir must exist and contain a regular sixtytwo.yaml before any process is started.

What it means

After confirming --config-dir is absolute, validateNodeQualificationArgs resolves it with fs.realpathSync.native and verifies it is a directory containing a regular file named sixtytwo.yaml. Any resolution/stat failure or missing file throws this error, emphasizing the check happens before any process is started.

Solutions

  1. Create/verify the directory and place sixtytwo.yaml inside it: mkdir -p /abs/dir && test -f /abs/dir/sixtytwo.yaml
  2. Point --config-dir at the exact directory that contains sixtytwo.yaml, not a parent
  3. Check the path resolves on this machine (no broken symlinks): realpath /abs/dir
  4. Ensure read permissions on the directory and the yaml file

Example fix

// before
args.push('--config-dir', '/opt/ito') // no sixtytwo.yaml here
// after
args.push('--config-dir', '/opt/ito/config') // contains sixtytwo.yaml
// or create it:
// fs.mkdirSync('/opt/ito/config', {recursive:true}); fs.writeFileSync('/opt/ito/config/sixtytwo.yaml', cfg)
Defensive patterns

Strategy: validation

Validate before calling

const fs = require('fs');
function cfgDirOk(d) {
  try { return fs.statSync(d).isDirectory() && fs.statSync(require('path').join(d, 'sixtytwo.yaml')).isFile(); }
  catch { return false; }
}
if (!cfgDirOk(configDir)) throw new Error('sixtytwo.yaml missing from config dir');

Try / catch

try {
  runEccItoEvals(configDir);
} catch (e) {
  if (e.message.includes('sixtytwo.yaml')) {
    console.error(`Place sixtytwo.yaml in ${configDir} or fix the path`);
  } else throw e;
}

Prevention

When it happens

Trigger: Running `ecc ito evals --live-sixtytwo ... --config-dir /abs/dir` where /abs/dir does not exist, is a file, or lacks a sixtytwo.yaml file directly inside it; symlink loops or permission errors during realpathSync also land here.

Common situations: Pointing at the parent directory instead of the one containing sixtytwo.yaml; a typo in the directory name; CI environments where the config checkout step was skipped; using a path that only exists on another machine.

Understand the failure class

Background: "Config file not found": what it means and how to fix it in docker-sync, Maven, Vagrant, Turborepo and other tools — this error's family across 60 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/5b7d834bbf82cd74. Report an issue: GitHub.

Appendix: source

Thrown at scripts/ito.js:135

  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."
    );
  }
}

function parseArgs(argv, environment = process.env) {
  const args = [...argv];
  if (
    args.length === 0
    || args.includes("--help")
    || args.includes("-h")
  ) {
    return Object.freeze({ help: true, invocationArgs: [] });
  }

  if (environment.ECC_DRY_RUN === "1" || args.includes("--dry-run")) {
    throw new Error(
      "Itô compute has no paper or dry-run success mode. No CLI operation was invoked."

View on GitHub (pinned to 8321021c54)