{"record":{"id":"ee1997ba036b73a0","repo":"jdx/mise","slug":"remote-rustc-action-diagnostic-blob-is-missing","errorCode":null,"errorMessage":"remote rustc action diagnostic blob is missing","messagePattern":"remote rustc action diagnostic blob is missing","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"crates/mise-cache-core/src/agent.rs","lineNumber":1234,"sourceCode":"    }\n\n    fn validate_prefetched_action(\n        action: &PrefetchedAction,\n        verified: &BTreeMap<CacheDigest, PathBuf>,\n        rustc_metadata: &BTreeMap<CacheDigest, RustcMetadata>,\n        directories: &BTreeMap<CacheDigest, CacheDirectory>,\n    ) -> Result<()> {\n        if !verified.contains_key(&action.result.action) {\n            bail!(\"remote action descriptor is missing\");\n        }\n        if let Some(metadata) = &action.result.metadata {\n            if action.adapter == \"rustc\" {\n                let metadata = rustc_metadata\n                    .get(metadata)\n                    .ok_or_else(|| eyre::eyre!(\"remote rustc action metadata is missing\"))?;\n                for digest in [&metadata.stdout, &metadata.stderr] {\n                    if !verified.contains_key(digest) {\n                        bail!(\"remote rustc action diagnostic blob is missing\");\n                    }\n                }\n            } else if !verified.contains_key(metadata) {\n                bail!(\"remote action metadata is missing\");\n            }\n        }\n        let mut pending = action\n            .result\n            .output_root\n            .iter()\n            .cloned()\n            .collect::<Vec<_>>();\n        let mut seen = BTreeMap::new();\n        while let Some(digest) = pending.pop() {\n            if seen.insert(digest.clone(), ()).is_some() {\n                continue;\n            }\n            if seen.len() > MAX_PREFETCH_DIRECTORY_OBJECTS {","sourceCodeStart":1216,"sourceCodeEnd":1252,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/crates/mise-cache-core/src/agent.rs#L1216-L1252","documentation":"For rustc-adapter actions, validate_prefetched_action looks up the action's metadata digest in the fetched rustc_metadata map, then requires BOTH its stdout and stderr diagnostic digests to be present in the verified blob map. Missing diagnostics mean the cached rustc action cannot replay its recorded compiler messages.","triggerScenarios":"A prefetch that downloaded the rustc metadata object but not one of its stdout/stderr diagnostic blobs; remote entry whose diagnostic blobs were evicted while metadata survived.","commonSituations":"Partial remote eviction; interrupted multi-object downloads; mixed-version writers that omit diagnostic blobs.","solutions":["Retry the run so prefetch re-attempts the full blob set, falling back to local execution on failure","If persistent, delete the incomplete remote action entry (metadata + directories + manifest reference) to force re-creation","Confirm all writers store stdout/stderr blobs alongside rustc metadata"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"match try_restore(&agent, &digest).await {\n    Ok(out) => out,\n    Err(e) if e.to_string().contains(\"diagnostic blob is missing\") => {\n        evict_remote_blobs_for_action(&digest).await?;\n        execute_and_store(&action).await?\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Ensure writers always upload stdout/stderr blobs referenced by rustc metadata","Give remote uploads all-or-nothing semantics per action (upload last, or mark complete)","Retry once before evicting — transient download gaps look identical to real holes"],"tags":["mise-cache","rustc","prefetch","missing-blob"],"backgroundTag":"missing-cache-blob","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}