Skip to content

Exit codes

Code Meaning
0 success
1 an action failed, or an unexpected git or I/O error
2 a usage, configuration or guard error; nothing was written
3 --strict found a problem that is not a failure; setup: a step is left to you

Per command:

Command 0 1 2 3
check no error (warnings allowed) — an error in a file, a pack or the history —
plan no target failed, including a run without the read key a target failed, a provider unavailable, the sweep failed configuration, an unknown fingerprint, a write key visible in CI, git older than 2.45 (unless offline) with --strict: a target blocked or deferred, an explicit target the platform does not know, targets.yml not fully resolved, the sweep off, or a run without the read key
distribute no target failed; a superseded run a target failed, a provider unavailable, the sweep failed, the mass-close guard a guard: the ref, the event, the probe, git older than 2.45, an operation flag in CI, the writer not matching hub.yml, --worktree with --strict: a target blocked or deferred, targets.yml not fully resolved, the sweep off
doctor no check failed a check failed, a provider unavailable configuration, a guard, --hub-token in CI with --strict: a check warn or unknown, targets.yml not fully resolved
probe no write credential or signing key in the job — a write credential or signing key is visible —
setup everything in place a step failed nothing written: the token, the hub or the flags a step is left to you; run setup again once done
migrate the files printed an account it checked does not exist, or the check failed the file is unreadable, not a GitLab multi-gitter config, or names something touchmark cannot express —
status, apply done, whatever the states a file could not be written configuration, a hub that fails check, apply without --packs when an org or group entry with packs might include the target —
manifest, schema, version done an I/O error usage, an unknown schema —

A usage error also prints the command's usage on stderr. Errors go to stderr; reports go to stdout, so --format json output stays valid JSON, annotations included.

In CI, 1 and 2 fail the job; 3 fails it only where --strict is set. The template sets --strict for plan on the hub's own pull requests, so a blocked or deferred target is visible before the merge, and not for distribute, whose deferred targets the next run picks up.