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
- Increase review max_chars so at least one pass has content (e.g. 50_000+)
- Increase max_passes so split pieces fit across passes
- Split the PR into smaller reviews, or exclude generated/vendored files from the diff
- 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
- Set max_chars comfortably above the largest expected file patch
- Exclude generated/vendored files from review diffs
- Derive max_chars from measured diff size, not a fixed small constant
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
- 127
- A pinned task provider requires an explicit model
- agent profile reasoning_effort must be one of: inherit…
- approval log has no parent
- artifact tree exceeds export depth limit
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)