CLI exit codes

This page defines the current exit-code contract for holon commands. It is a script-facing companion to the CLI stability policy and CLI contract inventory.

Holon keeps the contract intentionally small while the runtime is pre-1.0:

Exit codeMeaningStream contract
0The CLI command completed successfully.Machine-readable commands write their JSON or documented raw response to stdout. Human commands may write prose to stdout. Stderr remains diagnostic/log output.
1The command was accepted by the parser, but execution failed before a successful CLI result was produced. This includes unreachable control-plane requests, invalid runtime/config/provider setup, failed file IO, malformed stored config, and HTTP/control-plane errors surfaced by the client.Stdout is not script-safe and should usually be empty. Diagnostics are written to stderr by the top-level error renderer and may include chained context.
2Clap rejected the invocation before command execution, for example an unknown flag, missing required argument, invalid enum value, or invalid numeric range.Stdout is empty. Clap writes usage/error text to stderr.

Codes outside this table are not part of Holon's stable CLI contract. In particular, POSIX signal-derived exit statuses are owned by the operating system and should not be interpreted as Holon business results.

Representative cases

Invalid arguments

Parser failures exit with code 2:

holon --definitely-not-a-holon-flag
echo $? # 2

Use this class for invocation-shape problems only. Scripts should treat stderr as human-readable help/error text, not as a machine-readable schema.

Unreachable control plane

Commands that need the local or remote control plane exit with code 1 when transport fails:

HOLON_HTTP_ADDR=127.0.0.1:9 holon agent status
echo $? # 1

The CLI does not synthesize a JSON error envelope on stdout for transport failures. Use stderr for operator diagnostics and retry/backoff decisions in the calling script.

Invalid configuration or provider setup

Configuration that parses as a CLI invocation but is rejected by Holon's config validators exits with code 1:

holon config providers set script-test \
  --transport openai_responses \
  --base-url not-a-url
echo $? # 1

Commands that validate stored config during startup also use code 1 for malformed or unsupported config.

Successful transport with failed business state

When a command successfully talks to the control plane, Holon's CLI exit code reports the command transport/result-rendering outcome, not every business state embedded in the returned JSON. For example, a command that successfully creates, inspects, or returns a task record exits 0 if the HTTP request and response rendering succeeded, even if the returned task or runtime object has a domain state such as failed, cancelled, blocked, or waiting.

Scripts must inspect the documented JSON fields for business state. Holon will only promote a business state to a non-zero process exit when a command's specific reference page documents that behavior.

Stdout and stderr