windmill-labs/windmill · error

Runnable not found

Error message

Runnable not found: ${runnableId}

What it means

Lookup miss inside the app dev server's WebSocket backend handler: a client message requested execution of a runnable by id, but runnables[runnableId] (from loadRunnables) has no entry for it. This is the sync-path handler (runAndWaitForResult); the id in the message is the faulting input. It usually means the dev server's runnable registry is stale relative to the browser app — a runnable was renamed/deleted locally, or the app preview was built against an older snapshot than the one the dev server currently serves.

Solutions

  1. Restart the wmill app dev session so loadRunnables re-scans and the preview uses the current runnable set
  2. Check the app definition for references to a runnable id that no longer exists (renamed or removed component) and fix or delete the stale reference
  3. Save/re-sync the app in the editor so the dev server's registry and the served bundle agree
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cli/src/commands/app/dev.ts:1161 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/ae267ac9d44b035e. Report an issue: GitHub.

Appendix: source

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

        );

        const { type, reqId, runnable_id, v, jobId } = message;

        // Helper to send response
        const respond = (responseType: string, result: any, error: boolean) => {
          ws.send(JSON.stringify({ type: responseType, reqId, result, error }));
        };

        // Helper to execute and wait for result
        const runAndWaitForResult = async (
          runnableId: string,
          args: any,
        ): Promise<{ uuid: string; result: any }> => {
          const runnables = await loadRunnables();
          const runnable = runnables[runnableId];

          if (!runnable) {
            throw new Error(`Runnable not found: ${runnableId}`);
          }

          const uuid = await executeRunnable(
            runnable,
            workspaceId,
            appPath,
            runnableId,
            args,
            appTempRefs,
          );
          log.info(colors.gray(`[backend] Job started: ${uuid}`));

          const result = await waitForJob(workspaceId, uuid);
          return { uuid, result };
        };

        switch (type) {
          case "backend": {

View on GitHub (pinned to e474e8803c)