What’s New
Errors are now classified into specific failure categories - timeout, network, tls, auth, script, filesystem, protocol, route, and canceled - and each failed result carries a structured failure with category and message.
The CLI exit codes now reflect these categories by default:
| Exit code | Meaning |
|---|---|
0
| All passed |
1
| At least one result failed (assertions, tests, trace budgets) |
2
| Usage or selection error |
3
| Internal/unknown runtime failure |
20
| Timeout |
21
| Network (DNS, dial, connection reset) |
22
| TLS/certificate |
23
| Auth/authorization |
24
| Script execution |
25
| Filesystem/persistence |
26
| Protocol (malformed HTTP, gRPC, streaming) |
27
| Route/tunnel (SSH, K8s port-forward) |
130
| Canceled |
A new --fail-fast flag stops after the first failure and marks remaining requests as skipped.
Example - distinguish a timeout from an auth failure in CI:
resterm run --tag smoke --format json ./requests.http
code=$?
case $code in
0) echo "all good" ;;
20) echo "something timed out" ;;
23) echo "auth is broken, check tokens" ;;
*) echo "failed with exit code $code" ;;
esacWorkflow UI Redesign
The workflow stats view now uses a split-pane layout - step list on the left, detail view on the right. The cursor auto selects the first step that needs attention (failed or canceled). You can scroll through step details independently and Enter toggles focus between the list and the detail pane.
Breaking Changes (Headless API/JSON)
If you parse the JSON report output or consume the headless Go API, the following changes may affect your integration:
- New top-level schemaVersion field. Reports now include "schemaVersion": "1" at the root.
- summary has new fields. The summary object now includes exitCode (int), failureCodes (string array of unique failure codes) and stopReason ("fail_fast" or omitted).
// Before
{ "summary": { "total": 5, "passed": 3, "failed": 2, "skipped": 0 } }
// After
{ "summary": { "total": 5, "passed": 3, "failed": 2, "skipped": 0, "exitCode": 21, "failureCodes": ["network", "timeout"] } }
- Per-result and per-step failure object. Failed results and workflow/compare/profile steps now carry a failure field:
{
"failure": {
"code": "timeout",
"category": "timeout",
"exitCode": 20,
"message": "context deadline exceeded",
"source": "http"
}
}
- Default exit codes changed. The CLI now returns category-specific codes instead of always 1. If your CI scripts rely on exit 1 == failure, pass --exit-code-mode summary to restore the old 0/1/2 behavior.