nikivdev/code · error

Claude review failed

Error message

Claude review failed

What it means

Thrown when the Claude CLI subprocess used for review exits with a non-success status. Any captured stderr is printed to the user first, then the library bails with this generic message; Claude's own diagnostics appear just above it in output.

Source

Thrown at src/commit.rs:5734

            return Ok(ReviewResult {
                issues_found: false,
                issues: Vec::new(),
                summary: Some(format!(
                    "Claude review timed out after {}s",
                    timeout.as_secs()
                )),
                future_tasks: Vec::new(),
                timed_out: true,
                quality: None,
            });
        }

        if !status.success() {
            if !stderr_output.trim().is_empty() {
                println!("{}", stderr_output.trim_end());
            }
            println!("\nnotify: Claude review failed");
            bail!("Claude review failed");
        }

        let result = output_lines.join("\n");

        let mut review_json = parse_review_json(&result);
        let future_tasks = review_json
            .as_ref()
            .map(|parsed| normalize_future_tasks(&parsed.future_tasks))
            .unwrap_or_default();
        let summary = review_json.as_ref().and_then(|r| r.summary.clone());
        let quality = review_json.as_mut().and_then(|r| r.quality.take());
        let (issues_found, issues) = if let Some(ref parsed) = review_json {
            if let Some(summary) = parsed.summary.as_ref() {
                debug!(summary = summary.as_str(), "claude review summary");
            }
            (parsed.issues_found, parsed.issues.clone())
        } else if result.trim().is_empty() {
            (false, Vec::new())

View on GitHub (pinned to a747e741ae)

Solutions

  1. Read the stderr lines printed immediately before this error for Claude's actual reason.
  2. Re-authenticate Claude CLI (`claude` / `claude login`).
  3. Update the Claude CLI binary and verify the configured model name is valid.
  4. Test `claude` manually with a trivial prompt to isolate CLI vs. integration issues.
  5. Retry; transient Anthropic API errors often clear.
Defensive patterns

Strategy: try-catch

Validate before calling

// preflight: claude CLI present and authenticated
let probe = Command::new("claude").arg("--version").output()?;
if !probe.status.success() {
    anyhow::bail!("claude CLI missing or not authenticated");
}

Try / catch

match run_claude_review(&diff).await {
    Ok(r) => r,
    Err(e) if e.to_string() == "Claude review failed" => {
        // stderr was already printed; offer fallback
        eprintln!("Claude failed; falling back to local heuristics");
        fallback_review()
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Invoking the claude binary for a review where the process returns a non-zero exit code — auth failure, CLI error, invalid arguments, model/API outage.

Common situations: Claude CLI not logged in or API key expired; claude binary missing/outdated; invalid model name (ClaudeModel); network outage to Anthropic API; prompt too long.

Related errors


AI-assisted analysis of nikivdev/code@a747e741ae (2026-09-01). Data as JSON: /api/errors/97da069cef80fc8e. Report an issue: GitHub.