{"record":{"id":"206ac4afc8decbeb","repo":"Hmbown/CodeWhale","slug":"lane-exit-receipt-exceeds-bytes","errorCode":null,"errorMessage":"lane exit receipt {} exceeds {} bytes","messagePattern":"lane exit receipt (.+?) exceeds (.+?) bytes","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/lane/src/runtime.rs","lineNumber":524,"sourceCode":"        .map_err(|_| anyhow::anyhow!(\"lane proxy stderr logger panicked\"))?;\n    let mut exit_code = exit_status_code(status);\n    if let Some(error) = stdout_result.err().or_else(|| stderr_result.err()) {\n        append_proxy_failure(&log_path, &lane_id, &error)?;\n        exit_code = LANE_PROXY_FAILURE_EXIT_CODE;\n    }\n    write_lane_exit_receipt(&receipt_path, &receipt_tmp_path, &lane_id, exit_code)?;\n    Ok(exit_code)\n}\n\nfn read_lane_exit_receipt(log_path: &Path, lane_id: &str) -> Result<Option<LaneExitReceipt>> {\n    let path = lane_exit_receipt_path(log_path);\n    let metadata = match std::fs::metadata(&path) {\n        Ok(metadata) => metadata,\n        Err(err) if err.kind() == std::io::ErrorKind::NotFound => return Ok(None),\n        Err(err) => return Err(err).with_context(|| format!(\"stat {}\", path.display())),\n    };\n    if metadata.len() > MAX_EXIT_RECEIPT_BYTES {\n        bail!(\n            \"lane exit receipt {} exceeds {} bytes\",\n            path.display(),\n            MAX_EXIT_RECEIPT_BYTES\n        );\n    }\n    let bytes = std::fs::read(&path).with_context(|| format!(\"read {}\", path.display()))?;\n    let receipt: LaneExitReceipt =\n        serde_json::from_slice(&bytes).with_context(|| format!(\"parse {}\", path.display()))?;\n    if receipt.lane_id != lane_id {\n        bail!(\n            \"lane exit receipt {} belongs to {}, expected {}\",\n            path.display(),\n            receipt.lane_id,\n            lane_id\n        );\n    }\n    Ok(Some(receipt))\n}","sourceCodeStart":506,"sourceCodeEnd":542,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/lane/src/runtime.rs#L506-L542","documentation":"read_lane_exit_receipt stats the receipt file (returning Ok(None) cleanly if absent) and rejects files larger than MAX_EXIT_RECEIPT_BYTES before reading. An oversized receipt is treated as corrupt/tampered state rather than a valid exit record.","triggerScenarios":"reconcile() or the log-proxy test path reading an exit receipt file whose on-disk size exceeds MAX_EXIT_RECEIPT_BYTES.","commonSituations":"Corrupted or externally modified receipt files; leftovers from a writer version that allowed larger payloads; disk issues producing garbage files.","solutions":["Delete the oversized receipt file and let reconcile re-derive lane state (or rerun the lane to write a fresh receipt).","Verify nothing external writes into the lane's runtime directory.","If a legitimate new writer emits larger receipts, update MAX_EXIT_RECEIPT_BYTES consistently on both sides."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if let Ok(m) = std::fs::metadata(&receipt_path) { if m.len() > MAX_EXIT_RECEIPT_BYTES { std::fs::remove_file(&receipt_path).ok(); } }","typeGuard":null,"tryCatchPattern":"match read_lane_exit_receipt(&path, &lane_id) { Ok(None) => {/* no receipt yet */}, Ok(Some(r)) => {/* use r */}, Err(e) if e.to_string().contains(\"exceeds\") => { fs::remove_file(&path).ok(); reconcile_fresh()?; } Err(e) => return Err(e) }","preventionTips":["Treat oversized receipts as corrupt state: delete and re-derive.","Protect the lane runtime directory from external writers.","After version upgrades, clear or validate leftover receipt files."],"tags":["exit-receipt","size-limit","corruption"],"backgroundTag":"file-size-limit-exceeded","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}