{"record":{"id":"f35238cfcb12dedf","repo":"windmill-labs/windmill","slug":"from-opts-from-is-an-asset-not-a-runnable","errorCode":null,"errorMessage":"--from '${opts.from}' is an asset, not a runnable — start a run from a script (assets are produced, not run).","messagePattern":"--from '(.+?)' is an asset, not a runnable — start a run from a script \\(assets are produced, not run\\)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/pipeline/pipeline.ts","lineNumber":756,"sourceCode":"        );\n      }\n      throw new Error(`--from '${opts.from}' matched no script in f/${f}.`);\n    }\n    if (macroLibPaths.has(scriptPathOf(resolved))) {\n      throw new Error(\n        `--from '${opts.from}' is a \\`// macros\\` library — definition-only, injected into consuming scripts at run time, never a runnable step.`,\n      );\n    }\n    // A `--local` display-only node (a non-`// pipeline` DuckDB script surfaced\n    // only because it calls a macro) has no previewable content — reject it\n    // clearly rather than admitting it and silently producing an empty plan.\n    if (notRunnablePaths.has(scriptPathOf(resolved))) {\n      throw new Error(\n        `--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.`,\n      );\n    }\n    if (!resolved.startsWith(\"script:\")) {\n      throw new Error(\n        `--from '${opts.from}' is an asset, not a runnable — start a run from a script (assets are produced, not run).`,\n      );\n    }\n    if (!fromEligible.has(resolved)) {\n      throw new Error(\n        `--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.`,\n      );\n    }\n    start = resolved;\n  } else if (starts.size === 1) {\n    start = [...starts][0];\n  } else if (starts.size === 0) {\n    throw new Error(\n      `No schedule or manual root in f/${f} to start a bounded run from.`,\n    );\n  } else if ((opts.to ?? []).length === 0) {\n    // Multiple roots, no `--from`, no `--to` → run the whole pipeline.\n    runAll = true;","sourceCodeStart":738,"sourceCodeEnd":774,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/pipeline/pipeline.ts#L738-L774","documentation":"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.","triggerScenarios":"Thrown at cli/src/commands/pipeline/pipeline.ts:756 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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>"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}