Hmbown/CodeWhale · error

PR review plan covers 0 of

Error message

PR review plan covers 0 of {} file patches within {max_chars} characters per pass and {max_passes} pass(es); skipped: {}. No review was run or posted.

What it means

If the plan groups zero passes — every file patch was skipped as oversized for the per-pass char budget — no review can run. This error names every skipped file plus the limits so the failure reads as a limits problem, not a code verdict.

Solutions

  1. Increase review max_chars so at least one pass has content (e.g. 50_000+)
  2. Increase max_passes so split pieces fit across passes
  3. Split the PR into smaller reviews, or exclude generated/vendored files from the diff
  4. Inspect the skipped list in the message to see which files drove the overflow

Example fix

// before
"review": { "max_chars": 500, "max_passes": 1 }
// after
"review": { "max_chars": 60000, "max_passes": 3 }
Defensive patterns

Strategy: validation

Validate before calling

if max_chars < largest_patch_len { bail!("max_chars {} smaller than largest file patch", max_chars); }

Try / catch

match plan_pr_review(...) { Err(e) if e.to_string().contains("covers 0 of") => retry_with_larger_budget().await, ... }

Prevention

When it happens

Trigger: max_chars smaller than the largest single file patch, so every file is skipped; changed_files > 0 but all patches exceed the per-pass budget even after splitting; max_passes too low to fit any piece after splitting.

Common situations: max_chars configured far too low (e.g. 1000 chars) for a real PR; a single massive generated file dominating the diff; mis-set budget derived from an exhausted context budget.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/224e785a4c149758. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/tools/review.rs:569

    }
    // Passes beyond the budget are skipped in diff order, never fatal. The
    // plan reviews what fits and names the rest.
    for group in grouped.split_off(max_passes.min(grouped.len())) {
        for piece in group {
            let label = piece.label;
            let chars = super::review_pr::model_diff(&piece.diff).chars().count();
            skipped.push(PrReviewSkippedFile {
                file: label,
                reason: SKIP_REASON_BEYOND_MAX_PASSES.to_string(),
                chars,
            });
        }
    }

    // Only a plan that covers nothing still errors — and even then it
    // names every skipped file, so the failure reads as limits, not as a
    // verdict on the code.
    anyhow::ensure!(
        !grouped.is_empty(),
        "PR review plan covers 0 of {} file patches within {max_chars} characters per pass and {max_passes} pass(es); skipped: {}. No review was run or posted.",
        view.changed_files,
        format_skipped_files(&skipped)
    );

    let passes = grouped
        .into_iter()
        .enumerate()
        .map(|(index, pieces)| {
            let diff = pieces
                .iter()
                .map(|piece| -> &str { &piece.diff })
                .collect::<String>();
            let labels = pieces
                .iter()
                .map(|piece| piece.label.clone())
                .collect::<Vec<_>>();

View on GitHub (pinned to 73e0f67d83)