{"record":{"id":"95e5587504f20c40","repo":"affaan-m/ECC","slug":"executable-override-does-not-point-to-a-readabl","errorCode":null,"errorMessage":"${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.","messagePattern":"(.+?) does not point to a readable local Itô CLI file\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/ito.js","lineNumber":212,"sourceCode":"      \"run npm ci and npm run check, then set\",\n      `${EXECUTABLE_OVERRIDE} to the explicit absolute dist/bin/ito.js path.`,\n    ].join(\" \"));\n  }\n\n  if (!path.isAbsolute(configured)) {\n    throw new Error(\n      `${EXECUTABLE_OVERRIDE} must be an absolute path explicitly configured by the operator.`\n    );\n  }\n  return assertUsableExecutable(configured);\n}\n\nfunction assertUsableExecutable(candidate) {\n  let canonicalCandidate;\n  try {\n    canonicalCandidate = fs.realpathSync.native(candidate);\n  } catch {\n    throw new Error(\n      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`\n    );\n  }\n  if (!isCanonicalItoEntry(canonicalCandidate)) {\n    throw new Error(\n      `${EXECUTABLE_OVERRIDE} must point to the canonical dist/bin/ito.js entry.`\n    );\n  }\n  if (!isUsableExecutable(canonicalCandidate)) {\n    throw new Error(\n      `${EXECUTABLE_OVERRIDE} does not point to a readable local Itô CLI file.`\n    );\n  }\n  return canonicalCandidate;\n}\n\nfunction isCanonicalItoEntry(candidate) {\n  const pathSegments = path","sourceCodeStart":194,"sourceCodeEnd":230,"githubUrl":"https://github.com/affaan-m/ECC/blob/01e15490f04e29cfefe3896951f43db46994d8ee/scripts/ito.js#L194-L230","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Confirm the path exists: `test -e \"$ECC_ITO_CLI_EXECUTABLE\" && readlink -f \"$ECC_ITO_CLI_EXECUTABLE\"`.","Rebuild if missing: `cd ito-cloud-runtime/cli/ito-compute-cli && npm ci && npm run check`.","Point at the built dist entry, not the source: the path must end with dist/bin/ito.js (see isCanonicalItoEntry at ito.js:229).","Fix parent-directory permissions so realpath can traverse: `chmod +x` on each path component."],"exampleFix":"// before\n$ export ECC_ITO_CLI_EXECUTABLE=\"$HOME/ito-cloud-runtime/cli/ito-compute-cli/src/ito.js\"\n// after\n$ export ECC_ITO_CLI_EXECUTABLE=\"$HOME/ito-cloud-runtime/cli/ito-compute-cli/dist/bin/ito.js\"","handlingStrategy":"validation","validationCode":"const fs = require('fs');\nfunction assertExecutableResolves(candidate) {\n  try { return fs.realpathSync.native(candidate); }\n  catch (e) { throw new Error(`ECC_ITO_CLI_EXECUTABLE does not resolve: ${e.message}`); }\n}","typeGuard":null,"tryCatchPattern":"try {\n  resolveItoExecutable(env);\n} catch (err) {\n  if (err.message.endsWith('does not point to a readable local Itô CLI file.')) {\n    // distinguish line 212 (realpath) from line 222 (post-canonical-check) by re-running realpath yourself\n    try { fs.realpathSync.native(env.ECC_ITO_CLI_EXECUTABLE); }\n    catch (e) { /* line-212 path: missing/blocked */ }\n  }\n  throw err;\n}","preventionTips":["Pin ECC_ITO_CLI_EXECUTABLE to the built dist entry, not the source.","Rebuild the canonical CLI after pulling changes before re-running ecc ito.","In CI, cache the canonical build output under a stable absolute path."],"tags":["cli","ito","filesystem","validation","path","security"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}