{"record":{"id":"737a205f5673aa59","repo":"jdx/mise","slug":"remote-action-descriptor-is-missing","errorCode":null,"errorMessage":"remote action descriptor is missing","messagePattern":"remote action descriptor is missing","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"crates/mise-cache-core/src/agent.rs","lineNumber":1225,"sourceCode":"        Ok(directory)\n    }\n\n    #[cfg(test)]\n    fn load_cache_directory(&self, digest: &CacheDigest) -> Result<CacheDirectory> {\n        let path = self\n            .find_verified_blob(digest)?\n            .ok_or_else(|| eyre::eyre!(\"remote action output directory is missing\"))?;\n        Self::parse_cache_directory(&path)\n    }\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","sourceCodeStart":1207,"sourceCodeEnd":1243,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/crates/mise-cache-core/src/agent.rs#L1207-L1243","documentation":"validate_prefetched_action checks that every digest referenced by a prefetched action result exists in the `verified` blob map (blobs downloaded AND digest-checked). The action descriptor digest itself (action.result.action) must be present; a missing descriptor means the prefetch batch is incomplete and the action cannot be trusted for restore.","triggerScenarios":"A prefetch batch where the descriptor blob's download failed or was skipped while referenced outputs succeeded; the remote store lost the descriptor object (partial eviction); interrupted batch transfer.","commonSituations":"Flaky network dropping one object in a multi-object batch; concurrent garbage collection on the remote cache between manifest read and blob fetch.","solutions":["Retry the task run — failed prefetch falls back to normal (local) execution and the entry gets rewritten","Verify the remote entry is complete (descriptor blob present under its digest key); delete the incomplete entry so it is re-created","Check agent logs just before this error for the individual blob download failure that caused the gap"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Incomplete prefetch => fall back to local execution; cache repopulates on success\nmatch try_restore(&agent, &digest).await {\n    Ok(out) => out,\n    Err(e) if e.to_string().contains(\"remote action descriptor is missing\") => {\n        warn!(\"incomplete cache entry; executing locally\");\n        execute_and_store(&action).await?\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Design restore paths with a local-execution fallback for any prefetch validation error","Fetch-then-verify whole entry batches atomically; do not act on partial batches","Watch for concurrent GC on the remote cache evicting entries mid-read"],"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"}