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
- Regenerate both the receipt and the coverage manifest from the same review run and diff
- Compare `receipt.diff_fingerprint` and `coverage.manifest.diff_fingerprint` before attaching
- 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
- Always generate receipt and coverage in the same run and persist them together
- Never reuse a stored receipt with a freshly rebuilt manifest
- Include the diff fingerprint in persisted artifacts so mismatches are detectable
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
- Complete PR diff fingerprint changed before review…
- Codewhale successful run contained an error event
- Codewhale terminal receipt did not confirm auto tools
- Codewhale terminal receipt did not use provider openai
- Codewhale terminal receipt model did not match rollout
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)