{"record":{"id":"8c8106f5346628fb","repo":"Hmbown/CodeWhale","slug":"receipt-path-requires-write-receipt-or-check","errorCode":null,"errorMessage":"--receipt-path requires --write-receipt or --check-receipt","messagePattern":"--receipt-path requires --write-receipt or --check-receipt","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/lib.rs","lineNumber":8055,"sourceCode":"        }\n        if let Some(error) = review_error {\n            anyhow::bail!(error);\n        }\n    }\n    Ok(())\n}\n\nfn resolve_review_model(config: &Config, explicit_model: Option<&str>) -> String {\n    explicit_model\n        .map(str::trim)\n        .filter(|model| !model.is_empty())\n        .map(str::to_string)\n        .unwrap_or_else(|| config.default_model())\n}\n\nfn validate_review_receipt_args(args: &ReviewArgs) -> Result<()> {\n    if args.receipt_path.is_some() && !args.write_receipt && !args.check_receipt {\n        bail!(\"--receipt-path requires --write-receipt or --check-receipt\");\n    }\n    if args.write_receipt && args.check_receipt {\n        bail!(\"--write-receipt and --check-receipt are mutually exclusive\");\n    }\n    Ok(())\n}\n\nfn run_review_receipt_check(diff: &str, args: &ReviewArgs) -> Result<()> {\n    let (path, receipt) = if let Some(path) = args.receipt_path.as_ref() {\n        (\n            path.clone(),\n            crate::tools::review::read_review_receipt(path)\n                .with_context(|| format!(\"failed to read review receipt {}\", path.display()))?,\n        )\n    } else {\n        crate::tools::review::latest_review_receipt_for_diff(diff)?.ok_or_else(|| {\n            anyhow!(\n                \"No review receipt found for the current diff. Run `codewhale review --write-receipt` first, or pass --receipt-path.\"","sourceCodeStart":8037,"sourceCodeEnd":8073,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/lib.rs#L8037-L8073","documentation":"validate_review_receipt_args() enforces flag dependencies: `--receipt-path` only means something when the run either writes a receipt (`--write-receipt`) or verifies one (`--check-receipt`). Passing the path alone is rejected in run_review() before any diff collection or model call.","triggerScenarios":"`codewhale review --receipt-path <file>` with neither `--write-receipt` nor `--check-receipt` set.","commonSituations":"Splitting a receipt workflow into steps and forgetting which step carries which flag; leftover flags pasted from a longer command.","solutions":["Writing a receipt: add `--write-receipt`","Verifying a receipt: add `--check-receipt`","If you did not want receipt behavior, drop `--receipt-path` entirely"],"exampleFix":"// before\n$ codewhale review --receipt-path out.json\nError: --receipt-path requires --write-receipt or --check-receipt\n\n// after\n$ codewhale review --write-receipt --receipt-path out.json","handlingStrategy":"validation","validationCode":"[ -z \"$RECEIPT_PATH\" ] || [ -n \"$WRITE_RECEIPT$CHECK_RECEIPT\" ] || { echo '--receipt-path needs --write-receipt or --check-receipt' >&2; exit 2; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Model receipt flows as two fixed invocations (write step, check step) in scripts","Reject orphan flags at the wrapper boundary"],"tags":["review","receipt","cli","flag-dependency"],"backgroundTag":"invalid-flag-combination","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}