Skip to content
styrev0.13.1
GitHub

Exit codes

The process exit code is the machine-readable result. Codes above 2 follow the BSD sysexits.h convention, so a scheduler or CI job can branch on them without parsing any output.

Code Meaning Retryable
0 Success. For run, the ticket is done or a pull request is pr-ready. Also returned by --version, --help, and --inspect. —
1 Abandoned — reserved for a run that gives up for good. No code path in Styre emits it today. No — unexpected; report it
64 Command-line misuse, such as styre notify without --test. No — correct the invocation
65 Resume refused — either the branch moved since the run paused (without --accept-head), or another --resume already holds the lock on this run. Yes — --accept-head/--inspect, or wait for the other resume to finish
69 A program your build or test commands need is not installed on this machine. Yes — install it, re-run
70 An internal error. This one is a bug in Styre, not in your setup. No — please report it
75 The run paused. Every reason (out of budget, needs a human, interrupted) ends here, and every pause is resumable. Also returned by styre clean <ident> when that run is still live. Yes — styre run --resume <ident>
78 Bad configuration — an invalid value, an unknown adapter, or a profile that is not usable. No — fix the config

75 is the one to expect. It is a single, resumable outcome — the run paused — covering three reasons:

  • budget — a session limit was hit, or the provider account ran out of credits. The run saved its state and consumed no retry attempt.
  • needs_you — the loop bounded its retries, or hit something structurally unresolvable on its own (a bad acceptance criterion, a plan defect, a broken environment). Read the message before you resume.
  • interrupted — reserved for a crash, SIGINT, or a power loss. A graceful stop never prints this reason.

Every one of these is resumable with styre run --resume <ident> — there is no split between a pause that saves state and one that doesn’t. The checkpoint is written continuously while the run works, so it is always there. 75 is also what styre clean <ident> returns if it is pointed at a run that is still live — it refuses to reap a running effort’s disk state.

So 75 does not mean “safe to retry blindly” — a needs_you pause usually needs something fixed first — but it does always mean “resumable”. Read the message. It names the reason and, for a pause, prints the exact Resume with: … command. See Recovering a run.

1 is not a crash — it’s dormant. abandoned is a reserved terminal outcome for a run that gives up for good, with nothing left to continue from. No code path in Styre produces it today: every stop is a paused run with a reason, and pausing is always resumable. If you see exit 1, treat it as unexpected and worth reporting.

65 means either the world moved underneath a paused run, or two resumes collided. If the branch moved, decide whether to accept the new head with --accept-head or investigate first with --inspect. If another --resume already holds the lock on this run, wait for it to finish, or check styre ls to see what is currently running.

69 is caught before any tokens are spent, and the message names the missing program.

70 is worth reporting. Every other code is a situation Styre expects; 70 means it hit something it did not.

See Recovering a run for the full pause-and-resume workflow.