windmill-labs/windmill · error · Error
No schedule or manual root in f/${f} to start a bounded run
Error message
No schedule or manual root in f/${f} to start a bounded run from. What it means
Empty-start guard in the pipeline run command: no --from was given, and the folder's graph contains zero eligible roots (schedule or manual runnable) to start a bounded run from — every entry point is an event trigger or input-only entrypoint that the CLI can't auto-start. The input at fault is the folder's graph composition; without a startable root there is nothing to run.
Source
Thrown at cli/src/commands/pipeline/pipeline.ts:769
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;
} else {
throw new Error(
`f/${f} has ${starts.size} possible starts — pass --from <script> when using --to. Candidates: ${scriptsOf(starts).sort().join(", ")}`,
);
}
// Resolve --to end node(s): split on comma, resolve each. An unresolved or
// ambiguous token is a hard error — silently ignoring it would run a
// different subset than the user asked for.
const toTokens = (opts.to ?? []).flatMap((t) => t.split(",")).map((t) => t.trim()).filter(
Boolean,
);
const ends: string[] = [];View on GitHub (pinned to e474e8803c)
Solutions
- Pass an explicit --from <script> naming a runnable script to start from
- Bind an input-only entrypoint with --upload so it becomes runnable in this invocation
- Add a schedule or make one script manually runnable so a default root exists
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at cli/src/commands/pipeline/pipeline.ts:769 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/7e5d1f0953be35a9.
Report an issue: GitHub.