{"record":{"id":"d9cecf0396d149ba","repo":"jdx/mise","slug":"remote-action-metadata-is-missing","errorCode":null,"errorMessage":"remote action metadata is missing","messagePattern":"remote action metadata is missing","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"crates/mise-cache-core/src/agent.rs","lineNumber":1238,"sourceCode":"        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 {\n                bail!(\"remote action output tree is too large\");\n            }\n            let directory = directories\n                .get(&digest)","sourceCodeStart":1220,"sourceCodeEnd":1256,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/crates/mise-cache-core/src/agent.rs#L1220-L1256","documentation":"For non-rustc adapters that carry action.result.metadata, validate_prefetched_action requires that metadata digest to exist in the verified blob map. The metadata blob is part of the action's cached result; a prefetch batch missing it is incomplete and rejected.","triggerScenarios":"Prefetch downloaded the action descriptor and outputs but the metadata blob's fetch failed or was never scheduled; remote entry partially evicted.","commonSituations":"Network drops mid-batch; concurrent eviction; writers that reference metadata blobs they never upload.","solutions":["Retry the task run; prefetch validation failure falls back to executing the action locally","Delete the incomplete remote action entry if the error repeats, forcing a clean re-store","Inspect logs for the specific metadata blob digest whose download failed"],"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 metadata 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":["Upload every referenced blob before publishing the manifest that points to it","Keep restore logic resilient: any missing-blob error should degrade to local execution","Correlate per-blob download failures in logs with later validation errors"],"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"}