affaan-m/ECC · error

${EXECUTABLE_OVERRIDE} does not point to a readable local It

Error message

${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.

What it means

Thrown by assertUsableExecutable at scripts/ito.js:211-214 when fs.realpathSync.native(candidate) throws — i.e. the configured path does not exist, contains a broken symlink, has a permission-restricted parent, or hits a symlink loop. This is the first of three sequential gates in assertUsableExecutable: realpath resolution, canonical-entry-name check (error 110), and readability check (error 111). Note the identical message is reused at ito.js:222 (error 111) for a different failure, so line number is the only discriminator.

Source

Thrown at scripts/ito.js:212

      "run npm ci and npm run check, then set",
      `${EXECUTABLE_OVERRIDE} to the explicit absolute dist/bin/ito.js path.`,
    ].join(" "));
  }

  if (!path.isAbsolute(configured)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} must be an absolute path explicitly configured by the operator.`
    );
  }
  return assertUsableExecutable(configured);
}

function assertUsableExecutable(candidate) {
  let canonicalCandidate;
  try {
    canonicalCandidate = fs.realpathSync.native(candidate);
  } catch {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`
    );
  }
  if (!isCanonicalItoEntry(canonicalCandidate)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} must point to the canonical dist/bin/ito.js entry.`
    );
  }
  if (!isUsableExecutable(canonicalCandidate)) {
    throw new Error(
      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`
    );
  }
  return canonicalCandidate;
}

function isCanonicalItoEntry(candidate) {
  const pathSegments = path

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Confirm the path exists: `test -e "$ECC_ITO_CLI_EXECUTABLE" && readlink -f "$ECC_ITO_CLI_EXECUTABLE"`.
  2. Rebuild if missing: `cd ito-cloud-runtime/cli/ito-compute-cli && npm ci && npm run check`.
  3. Point at the built dist entry, not the source: the path must end with dist/bin/ito.js (see isCanonicalItoEntry at ito.js:229).
  4. Fix parent-directory permissions so realpath can traverse: `chmod +x` on each path component.

Example fix

// before
$ export ECC_ITO_CLI_EXECUTABLE="$HOME/ito-cloud-runtime/cli/ito-compute-cli/src/ito.js"
// after
$ export ECC_ITO_CLI_EXECUTABLE="$HOME/ito-cloud-runtime/cli/ito-compute-cli/dist/bin/ito.js"
Defensive patterns

Strategy: validation

Validate before calling

const fs = require('fs');
function assertExecutableResolves(candidate) {
  try { return fs.realpathSync.native(candidate); }
  catch (e) { throw new Error(`ECC_ITO_CLI_EXECUTABLE does not resolve: ${e.message}`); }
}

Try / catch

try {
  resolveItoExecutable(env);
} catch (err) {
  if (err.message.endsWith('does not point to a readable local Itô CLI file.')) {
    // distinguish line 212 (realpath) from line 222 (post-canonical-check) by re-running realpath yourself
    try { fs.realpathSync.native(env.ECC_ITO_CLI_EXECUTABLE); }
    catch (e) { /* line-212 path: missing/blocked */ }
  }
  throw err;
}

Prevention

When it happens

Trigger: ECC_ITO_CLI_EXECUTABLE points to a path that does not exist; points through a symlink whose target is missing; parent directory lacks execute (traverse) permission; symlink loop; ENOENT/EACCES/ELOOP from realpathSync. Always fires before isCanonicalItoEntry and isUsableExecutable.

Common situations: Operator deleted or moved ito-cloud-runtime after setting the env var; pointed at the source file (cli/.../src/ito.js) instead of the built dist entry; cloned to a different path than the env var records; file ownership changed under sudo.

Related errors


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