{"record":{"id":"7364f0e4a0287c89","repo":"windmill-labs/windmill","slug":"f-f-has-starts-size-possible-starts-pass","errorCode":null,"errorMessage":"f/${f} has ${starts.size} possible starts — pass --from <script> when using --to. Candidates: ${scriptsOf(starts).sort().join(\", \")}","messagePattern":"f/(.+?) has (.+?) possible starts — pass --from <script> when using --to\\. Candidates: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/pipeline/pipeline.ts","lineNumber":776,"sourceCode":"      );\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;\n  } else {\n    throw new Error(\n      `f/${f} has ${starts.size} possible starts — pass --from <script> when using --to. Candidates: ${scriptsOf(starts).sort().join(\", \")}`,\n    );\n  }\n\n  // Resolve --to end node(s): split on comma, resolve each. An unresolved or\n  // ambiguous token is a hard error — silently ignoring it would run a\n  // different subset than the user asked for.\n  const toTokens = (opts.to ?? []).flatMap((t) => t.split(\",\")).map((t) => t.trim()).filter(\n    Boolean,\n  );\n  const ends: string[] = [];\n  const unresolved: string[] = [];\n  for (const tok of toTokens) {\n    const id = resolveToken(graph, tok);\n    if (!id) unresolved.push(tok);\n    else ends.push(id);\n  }\n  if (unresolved.length > 0) {","sourceCodeStart":758,"sourceCodeEnd":794,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/pipeline/pipeline.ts#L758-L794","documentation":"Multi-root ambiguity guard in the pipeline run command: no --from was given, --to is present (bounding requires a single start), and the folder's graph has several eligible roots (schedule/manual runnables). The message lists the candidate start scripts sorted; the CLI refuses to guess which root to bound the run from.","triggerScenarios":"Thrown at cli/src/commands/pipeline/pipeline.ts:776 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Pass --from <script> choosing one of the listed candidates","Drop --to to run all roots / the whole pipeline in topological order","Narrow the folder (f flag) so only one root is in scope"],"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"}