windmill-labs/windmill · error

Invalid runnable '${runnableId}': ${debugInfo}. Must have ei

Error message

Invalid runnable '${runnableId}': ${debugInfo}. Must have either inlineScript (for inline type) or type="path" with runType and path fields

What it means

Shape validation in the dev server's runnable executor: the runnable object must be either an inline script (has inlineScript) or a path-based reference (type 'path' or legacy 'runnableByPath' plus runType 'script'|'hubscript'|'flow' and a path). It is neither — the debugInfo in the message dumps the actual type/runType/path/hasInlineScript values so the malformed field is visible. The faulting input is a single runnable entry in the app's runnables (often hand-edited YAML/JSON or an app exported from an incompatible version).

Source

Thrown at cli/src/commands/app/dev.ts:1873

    runnable.path
  ) {
    // Path-based runnables have type: "path" (or legacy "runnableByPath") and runType: "script"|"hubscript"|"flow"
    const prefix = runnable.runType;
    requestBody.path = prefix !== "hubscript"
      ? `${prefix}/${runnable.path}`
      : `script/${runnable.path}`;
  } else {
    // Neither inline script nor valid path-based runnable
    const debugInfo =
      `type=${(runnable as any).type}, runType=${(runnable as any).runType}, ` +
      `path=${(runnable as any).path}, hasInlineScript=${!!(runnable as any)
        .inlineScript}`;
    log.error(
      colors.red(
        `[executeRunnable] Invalid runnable configuration for '${runnableId}': ${debugInfo}`,
      ),
    );
    throw new Error(
      `Invalid runnable '${runnableId}': ${debugInfo}. ` +
        `Must have either inlineScript (for inline type) or type="path" with runType and path fields`,
    );
  }

  const uuid = await wmill.executeComponent({
    workspace,
    path: appPath,
    requestBody,
  });

  return uuid;
}

const ITERATIONS_BEFORE_SLOW_REFRESH = 10;
const ITERATIONS_BEFORE_SUPER_SLOW_REFRESH = 100;
const QUEUE_LOG_INTERVAL_MS = 5000;

View on GitHub (pinned to e474e8803c)

Solutions

  1. Read the dumped debugInfo: whichever of type/runType/path/inlineScript is wrong points at the broken runnable entry
  2. Fix the runnable definition: give it a valid inlineScript, or set type: "path" with runType (script|hubscript|flow) and path
  3. If the app was exported from another Windmill version, re-create the runnable in the editor so it serializes in the current format
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cli/src/commands/app/dev.ts:1873 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/418580e198ff5fba. Report an issue: GitHub.