windmill-labs/windmill · error · Error

--from '${opts.from}' can't start a run: row-backed event tr

Error message

--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-s

What it means

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-s" thrown in windmill-labs/windmill.

Source

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

      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;
  } else {
    throw new Error(
      `f/${f} has ${starts.size} possible starts — pass --from <script> when using --to. Candidates: ${scriptsOf(starts).sort().join(", ")}`,
    );
  }

View on GitHub (pinned to e474e8803c)

Solutions

  1. Bind the trigger's input explicitly with --upload (e.g. --upload webhook_script:payload=file.json) so it and its downstream run in the cascade
  2. Start from an eligible script downstream of the trigger instead
  3. Remove --from and use --to to bound the run from the single schedule/manual root
Defensive patterns

Strategy: validation

When it happens

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