{"record":{"id":"d3a32fe7a00333ce","repo":"jdx/mise","slug":"unsupported-task-cache-archive-entry-type","errorCode":null,"errorMessage":"unsupported task cache archive entry type","messagePattern":"unsupported task cache archive entry type","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/task_cache_store.rs","lineNumber":610,"sourceCode":"                digest: CacheDigest {\n                    algorithm: \"blake3\".into(),\n                    hash: hasher.finalize().to_hex().to_string(),\n                    size,\n                },\n                executable: mode & 0o111 != 0,\n                mode,\n                file: temporary,\n            }\n        } else if entry_type == EntryType::Symlink {\n            let target = entry\n                .header()\n                .link_name()\n                .ok_or_else(|| eyre!(\"remote cache symlink is missing its target\"))?\n                .into_owned();\n            validate_cache_symlink_target(&entry_path, &target)?;\n            ArchiveNode::Symlink { mode, target }\n        } else {\n            bail!(\"unsupported task cache archive entry type\");\n        };\n        if nodes.insert(entry_path.clone(), node).is_some() {\n            bail!(\"task cache archive contains duplicate paths\");\n        }\n        let mut parent = entry_path.parent();\n        while let Some(path) = parent {\n            nodes\n                .entry(path.to_path_buf())\n                .or_insert(ArchiveNode::Directory { mode: 0o755 });\n            parent = path.parent();\n        }\n    }\n\n    fn build_directory(\n        path: &Path,\n        nodes: &BTreeMap<PathBuf, ArchiveNode>,\n        directory_uploads: &mut Vec<BlobUpload>,\n    ) -> Result<CacheDigest> {","sourceCodeStart":592,"sourceCodeEnd":628,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/task/task_cache_store.rs#L592-L628","documentation":"When archiving a task output into the CAS, only regular files, directories, and symlinks are supported archive entry types. Any other tar/entry type (device nodes, FIFOs, sockets, hardlinks depending on the reader) is rejected because the remote cache node model cannot represent it.","triggerScenarios":"commit → archive_to_cas walking an output tree (or reading an archive) containing a special file: FIFO, Unix socket, device node, or other non-file/dir/symlink entry type.","commonSituations":"Task outputs that include files created by test harnesses or servers (e.g. unix sockets in build dirs), /dev node copies, or archives built with tools that embed hardlink/device entries.","solutions":["Exclude special files from the task's declared outputs (add ignore patterns or write them elsewhere).","Change the producing tool to create a regular file or symlink instead of a FIFO/socket in the output directory.","If hardlinks are intended, change the archiving step to dereference/copy them as regular files."],"exampleFix":"// before\nmkfifo build/progress.fifo   # included in cached outputs\n// after\nmkfifo /tmp/progress.fifo    # keep special files out of cached outputs","handlingStrategy":"validation","validationCode":"fn entry_type_cacheable(ft: std::fs::FileType) -> bool {\n    ft.is_file() || ft.is_dir() || ft.is_symlink()\n}","typeGuard":"fn cacheable_entry(md: &std::fs::Metadata) -> Option<&std::fs::Metadata> {\n    let ft = md.file_type();\n    (ft.is_file() || ft.is_dir() || ft.is_symlink()).then_some(md)\n}","tryCatchPattern":"match commit(&out).await {\n    Err(e) if e.to_string().contains(\"unsupported task cache archive entry type\") => {\n        // exclude the special file and retry, or copy it to a regular file\n    }\n    r => r?,\n}","preventionTips":["Keep FIFOs/sockets/device nodes out of declared task outputs","Configure output ignore patterns for runtime scratch files","Pre-open sockets/FIFOs outside the output directory"],"tags":["archive","unsupported-entry","task-cache"],"backgroundTag":"unsupported-operation","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}