{"record":{"id":"79a5c3d672647ad7","repo":"jdx/mise","slug":"remote-action-output-file-is-missing","errorCode":null,"errorMessage":"remote action output file is missing","messagePattern":"remote action output file is missing","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"crates/mise-cache-core/src/agent.rs","lineNumber":1260,"sourceCode":"            .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 {\n                bail!(\"remote action output tree is too large\");\n            }\n            let directory = directories\n                .get(&digest)\n                .ok_or_else(|| eyre::eyre!(\"remote action output directory is missing\"))?;\n            for file in &directory.files {\n                if !verified.contains_key(&file.digest) {\n                    bail!(\"remote action output file is missing\");\n                }\n            }\n            pending.extend(\n                directory\n                    .directories\n                    .iter()\n                    .map(|directory| directory.digest.clone()),\n            );\n        }\n        Ok(())\n    }\n\n    #[cfg(test)]\n    async fn prefetch_output_tree(\n        &self,\n        remote: &RemoteCacheClient,\n        output_root: &CacheDigest,\n    ) -> Result<()> {","sourceCodeStart":1242,"sourceCodeEnd":1278,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/crates/mise-cache-core/src/agent.rs#L1242-L1278","documentation":"While walking the prefetched output tree, every file digest listed in a CacheDirectory must exist in the verified blob map. A file whose blob was not downloaded and digest-verified makes the prefetch batch incomplete, so the action is rejected instead of restored with holes.","triggerScenarios":"A directory object arrived but one of its file blobs failed to download or failed digest verification earlier in the batch; remote entry missing individual file objects.","commonSituations":"Partial network failures during large batch downloads; remote cache objects evicted mid-prefetch; interrupted uploads from the writer.","solutions":["Retry the run — the action executes locally and the cache entry is rewritten","If persistent, remove the incomplete remote action entry so it is re-created whole","Check for concurrent eviction/GC running against the remote cache bucket"],"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(\"remote action output file 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":["Publish a cache entry only after every file blob it references is uploaded","Retry once on missing-file errors before evicting — single-object download drops are common","Avoid running aggressive remote GC concurrently with heavy prefetch traffic"],"tags":["mise-cache","prefetch","missing-blob","integrity"],"backgroundTag":"missing-cache-blob","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}