The run comes back as JSONL
Put --json-events ahead of the subcommand and every lifecycle event lands on stdout as one JSON object: spawning, ready_for_prompt, running_tool, tool_result, message_delta, turn_usage, fallback_triggered, finished. Failures carry a stable kind — api_rate_limit, auth_expired, network, stream_disconnect — so a job can branch on the kind instead of matching an error string.