## TL;DR

Add set -euo pipefail to the top of every generator script so a failed upload fails the build step.

## Steps

1. [buildkite/docs]: `pipeline upload` exits non-zero on rejected YAML, validation errors, or transient failures, but Bash does not exit on errors by default, so a failed upload inside a script leaves the build green with no steps. Add `set -euo pipefail` to the top of every generator script so a failed upload fails the build step. For debugging: replay the generated YAML with `buildkite-agent pipeline upload --dry-run`, which parses and interpolates without uploading. Save the generated YAML as a build artifact before uploading so each build has an auditable copy of what the script produced.

## When to use

You are seeing this: [buildkite/docs]: pipeline upload exits non-zero on rejected YAML, validation errors, or transient failures, but Bash does not exit on errors by default, so a failed upload inside a script leaves the build green with no steps. Use this skill when you run into "Buildkite dynamic pipeline silently produces no steps: use set -euo pipefail".

## When not to use

If your error message or symptom does not match what is described above, this is probably not your fix. Search for your exact error text instead of forcing this one to fit.

## Versions

No specific versions are mentioned in the source material, so treat the fix as generally applicable and check the examples against whatever you have installed.

## Why this happens

The original report does not dig into a root cause. It documents the symptom and the fix that resolved it.
