Hmbown/CodeWhale · error

Review receipt and PR coverage manifest fingerprints differ

Error message

Review receipt and PR coverage manifest fingerprints differ

What it means

`attach_pr_review_coverage` binds a `ReviewReceipt` to a `ReviewReceiptCoverage` only when both refer to the same diff — checked via the diff fingerprint. A mismatch means the receipt was produced against a different version of the PR diff than the coverage manifest, so attaching coverage would misrepresent what was reviewed.

Solutions

  1. Regenerate both the receipt and the coverage manifest from the same review run and diff
  2. Compare `receipt.diff_fingerprint` and `coverage.manifest.diff_fingerprint` before attaching
  3. Re-run the review if the PR changed since the receipt was produced

Example fix

// before
attach_pr_review_coverage(&mut old_receipt, new_coverage)?;
// after
if old_receipt.diff_fingerprint != new_coverage.manifest.diff_fingerprint {
    let (_, _, coverage) = rerun_review(&complete_diff)?; // fresh receipt + coverage
}
attach_pr_review_coverage(&mut old_receipt, new_coverage)?;
Defensive patterns

Strategy: validation

Validate before calling

if receipt.diff_fingerprint != coverage.manifest.diff_fingerprint { return Err(anyhow!("receipt/coverage fingerprint mismatch")); }

Try / catch

match attach_pr_review_coverage(&mut receipt, coverage) { Err(e) if e.to_string().contains("fingerprints differ") => regenerate_receipt_and_coverage(), Err(e) => return Err(e), Ok(()) => {} }

Prevention

When it happens

Trigger: Calling `attach_pr_review_coverage(&mut receipt, coverage)` where `receipt.diff_fingerprint != coverage.manifest.diff_fingerprint`, e.g. the receipt came from an earlier review run or a re-fetched diff after the PR changed.

Common situations: Re-attaching a stored receipt after the PR moved; mixing receipts and coverage from two review runs; rebuilding the manifest from a fresh diff while reusing an old receipt.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


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

Appendix: source

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

                    line: issue.line,
                })
                .collect(),
        },
        unresolved_risk: ReviewReceiptRisk {
            unresolved,
            level: risk_level,
            summary: risk_summary,
        },
        review_content_sha256: sha256_hex(review_content.as_bytes()),
        coverage: None,
    }
}

pub(crate) fn attach_pr_review_coverage(
    receipt: &mut ReviewReceipt,
    coverage: ReviewReceiptCoverage,
) -> anyhow::Result<()> {
    anyhow::ensure!(
        receipt.diff_fingerprint == coverage.manifest.diff_fingerprint,
        "Review receipt and PR coverage manifest fingerprints differ"
    );
    anyhow::ensure!(
        coverage.completed_passes.len() == coverage.manifest.passes.len()
            && coverage
                .completed_passes
                .iter()
                .enumerate()
                .all(|(index, pass)| pass.number == index + 1),
        "Review receipt does not cover every planned PR pass"
    );
    receipt.schema_version = PR_COVERAGE_RECEIPT_SCHEMA_VERSION;
    receipt.coverage = Some(coverage);
    Ok(())
}

pub fn write_review_receipt(

View on GitHub (pinned to 73e0f67d83)