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
- Start from the script that produces the asset instead of the asset itself
- 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.