{"record":{"id":"ffa5b86f83635a64","repo":"windmill-labs/windmill","slug":"could-not-verify-triggers-for-r-path-e-body","errorCode":null,"errorMessage":"Could not verify triggers for ${r.path} (${e?.body ?? e?.message ?? e}) — aborting so an input-only entrypoint isn't run with empty args; retry once resolved.","messagePattern":"Could not verify triggers for (.+?) \\((.+?)\\) — aborting so an input-only entrypoint isn't run with empty args; retry once resolved\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/pipeline/pipeline.ts","lineNumber":241,"sourceCode":"  graph: BCGraph,\n): Promise<void> {\n  const scripts = (graph.runnables ?? []).filter((r) => r.usage_kind === \"script\");\n  await Promise.all(\n    scripts.map(async (r) => {\n      const known = new Set(\n        (graph.triggers ?? [])\n          .filter((t) => t.runnable_path === r.path && MARKER_KINDS.has(t.trigger_kind))\n          .map((t) => t.trigger_kind),\n      );\n      let script;\n      try {\n        script = await wmill.getScriptByPath({ workspace: workspaceId, path: r.path });\n      } catch (e: any) {\n        // Fail CLOSED: if we can't read a script's body we can't rule out a\n        // marker-only input trigger, so aborting is safer than auto-running it\n        // with empty args. (The `show` enrichment stays best-effort — it only\n        // affects the rendered tree, not what runs.)\n        throw new Error(\n          `Could not verify triggers for ${r.path} (${e?.body ?? e?.message ?? e}) — ` +\n            `aborting so an input-only entrypoint isn't run with empty args; retry once resolved.`,\n        );\n      }\n      for (const kind of recoverHeaderMarkers(script.content ?? \"\")) {\n        if (known.has(kind)) continue;\n        known.add(kind);\n        graph.triggers.push({\n          trigger_kind: kind,\n          runnable_kind: \"script\",\n          runnable_path: r.path,\n        });\n      }\n    }),\n  );\n}\n\n// Index a pipeline graph and render its DAG as an ASCII tree. Shared by the","sourceCodeStart":223,"sourceCodeEnd":259,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/cli/src/commands/pipeline/pipeline.ts#L223-L259","documentation":"Deliberately fail-closed error from enrichDeployedNonAutorunTriggers (used by `wmill pipeline run`). Before auto-running a deployed pipeline entrypoint that is not marked auto-run, the CLI fetches the script body to check for input-only trigger markers; if that fetch fails it aborts, because running an input-only entrypoint with empty args could execute unintended work. The error names the offending path and embeds the underlying cause, and tells the user to retry once resolved.","triggerScenarios":"Running `wmill pipeline run <path>` when `wmill.getScriptByPath` fails for the entrypoint: 404 (script path no longer exists in the workspace), 401/403 (token lacks read access), 5xx, or a network failure mid-run.","commonSituations":"The pipeline references a script that was renamed or deleted after local pull; the CLI token is read-scoped differently than expected; the workspace was switched between pull and run; flaky connectivity in CI.","solutions":["Read the parenthesized cause: 404 -> fix or re-pull the pipeline so the referenced script path exists in the workspace.","401/403 -> re-authenticate or grant the token read access to the script, then retry the command.","Network/5xx cause -> wait for the server to recover and re-run; the command is safe to retry since it aborted before executing anything.","Verify the intended workspace with `wmill workspace show` if the path was recently pulled from a different one."],"exampleFix":"// before: script renamed on server\nwmill pipeline run f/old_entrypoint\n\n// after\nwmill pipeline pull  # refresh local state\nwmill pipeline run f/new_entrypoint","handlingStrategy":"try-catch","validationCode":"// Verify the entrypoint is readable before attempting a run\ntry {\n  await wmill.getScriptByPath({ workspace: ws, path: entrypointPath });\n} catch (e) {\n  throw new Error(`Entrypoint ${entrypointPath} not verifiable — fix before running`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await runPipeline(opts);\n} catch (e: any) {\n  if (e.message.includes(\"Could not verify triggers\")) {\n    const cause = /\\((.+)\\)/.exec(e.message)?.[1];\n    if (cause?.includes(\"404\")) console.error(\"Re-pull: referenced script no longer exists\");\n    else console.error(\"Transient/read failure — safe to retry after resolving:\", cause);\n  }\n  throw e;\n}","preventionTips":["Run `wmill pipeline pull` after renaming or deleting referenced scripts so local paths stay in sync.","Ensure the token has read access to every script in the pipeline.","Confirm the active workspace matches the one the pipeline was pulled from."],"tags":["network","cli","fail-closed"],"backgroundTag":"remote-resource-not-verifiable","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"}