stablyai/orca · error

Windows inner executable path is not a file: ${executablePat

Error message

Windows inner executable path is not a file: ${executablePath}

What it means

Thrown by validateExecutablePath() when the path exists but statSync().isFile() returns false — the path resolves to a directory, socket, device, or other non-regular-file. This guards against passing a directory path (e.g. the containing folder) instead of the .exe file.

Source

Thrown at config/scripts/verify-windows-inner-signature.mjs:128

    `Subject: ${normalizeSignerSubject(signature.signerSubject) || '<missing>'}`,
    `Issuer: ${signature.signerIssuer ?? '<missing>'}`,
    `Thumbprint: ${normalizeThumbprint(signature.signerThumbprint) || '<missing>'}`,
    `NotBefore: ${signature.notBefore ?? '<missing>'}`,
    `NotAfter: ${signature.notAfter ?? '<missing>'}`
  ].join('\n')
}

export function validateExecutablePath(executablePath) {
  if (typeof executablePath !== 'string' || executablePath.trim() === '') {
    throw new Error('Usage: node config/scripts/verify-windows-inner-signature.mjs <Orca.exe>')
  }

  if (!existsSync(executablePath)) {
    throw new Error(`Windows inner executable does not exist: ${executablePath}`)
  }

  if (!statSync(executablePath).isFile()) {
    throw new Error(`Windows inner executable path is not a file: ${executablePath}`)
  }
}

export function getPowerShellSignatureJson(executablePath, spawnSyncImpl = spawnSync) {
  // Why: pwsh -Command does not reliably expose trailing process args to string commands.
  const result = spawnSyncImpl(
    'pwsh',
    [
      '-NoLogo',
      '-NoProfile',
      '-NonInteractive',
      '-ExecutionPolicy',
      'Bypass',
      '-Command',
      POWERSHELL_SIGNATURE_SCRIPT
    ],
    {
      encoding: 'utf8',

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Point to the actual .exe file, not its parent directory.
  2. If using a glob or variable, append the filename explicitly.
  3. Verify with ls -la <path> that the entry is a regular file.

Example fix

// before: directory path passed
node verify-windows-inner-signature.mjs ./Release/win-unpacked/

// after: the exe file inside the directory
node verify-windows-inner-signature.mjs ./Release/win-unpacked/Orca.exe
Defensive patterns

Strategy: validation

Validate before calling

function assertExecutableIsFile(path) {
  const stat = statSync(path)
  if (!stat.isFile()) {
    throw new Error(`Path is not a regular file: ${path}`)
  }
}

Type guard

function isRegularFile(path) {
  try { return statSync(path).isFile() } catch { return false }
}

Prevention

When it happens

Trigger: validateExecutablePath(executablePath) where existsSync is true but statSync(executablePath).isFile() is false. Caused by: passing a directory path instead of the .exe; passing a path to /dev/null or a named pipe; a symlink pointing to a directory.

Common situations: Passing the win-unpacked directory instead of Orca.exe inside it; passing a Squirrel app folder; a path glob that resolved to a directory; accidentally passing the build output directory rather than the executable within it.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/58f85e8ce23fec55. Report an issue: GitHub.