windmill-labs/windmill · error · Error

--from '${opts.from}' is an asset, not a runnable — start a

Error message

--from '${opts.from}' is an asset, not a runnable — start a run from a script (assets are produced, not run).

What it means

Kind guard for --from in the pipeline run command: the resolved node id does not start with 'script:' — it is an asset node, not a runnable. Assets are produced by scripts, not executed, so they cannot start a run. The input at fault is a --from value that resolves to an asset (table/dataset) in the graph.

Source

Thrown at cli/src/commands/pipeline/pipeline.ts:756

        );
      }
      throw new Error(`--from '${opts.from}' matched no script in f/${f}.`);
    }
    if (macroLibPaths.has(scriptPathOf(resolved))) {
      throw new Error(
        `--from '${opts.from}' is a \`// macros\` library — definition-only, injected into consuming scripts at run time, never a runnable step.`,
      );
    }
    // A `--local` display-only node (a non-`// pipeline` DuckDB script surfaced
    // only because it calls a macro) has no previewable content — reject it
    // clearly rather than admitting it and silently producing an empty plan.
    if (notRunnablePaths.has(scriptPathOf(resolved))) {
      throw new Error(
        `--from '${opts.from}' isn't a \`// pipeline\` script — it appears in the local graph only as a macro consumer (lineage). Mark it \`// pipeline\` to run it.`,
      );
    }
    if (!resolved.startsWith("script:")) {
      throw new Error(
        `--from '${opts.from}' is an asset, not a runnable — start a run from a script (assets are produced, not run).`,
      );
    }
    if (!fromEligible.has(resolved)) {
      throw new Error(
        `--from '${opts.from}' can't start a run: row-backed event triggers (kafka/mqtt/nats/postgres/sqs/gcp/email) and input-only entrypoints (webhook/data_upload) fan out per-event or need caller-supplied input — bind it with --upload to run it.`,
      );
    }
    start = resolved;
  } else if (starts.size === 1) {
    start = [...starts][0];
  } else if (starts.size === 0) {
    throw new Error(
      `No schedule or manual root in f/${f} to start a bounded run from.`,
    );
  } else if ((opts.to ?? []).length === 0) {
    // Multiple roots, no `--from`, no `--to` → run the whole pipeline.
    runAll = true;

View on GitHub (pinned to e474e8803c)

Solutions

  1. Start from the script that produces the asset instead of the asset itself
  2. If you want the asset refreshed, run its producing script with --from <that script>
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at cli/src/commands/pipeline/pipeline.ts:756 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/f35238cfcb12dedf. Report an issue: GitHub.