jdx/mise · error
task cache archive is missing {}
Error message
task cache archive is missing {} What it means
After extracting the cached tar.zst archive into a staging directory, mise verifies every manifest.roots entry actually exists in the extracted tree. If an expected root is missing (neither exists() nor symlink_metadata succeeds), the archive is incomplete relative to its manifest and the restore bails.
Source
Thrown at src/task/task_cache.rs:609
.map(|artifact| artifact.path())
.ok_or_else(|| eyre!("task cache archive is missing"))?;
let staging = tempfile::Builder::new()
.prefix(".mise-task-cache-")
.tempdir_in(&self.root)?;
file::untar(
archive_path,
staging.path(),
ExtractionFormat::TarZst,
&ExtractOptions {
preserve_mtime: false,
..Default::default()
},
)?;
for rel in &manifest.roots {
let restored = staging.path().join(rel);
if !restored.exists() && fs::symlink_metadata(&restored).is_err() {
bail!("task cache archive is missing {}", rel.display());
}
ensure_no_symlink_ancestors(staging.path(), rel)?;
ensure_no_symlink_ancestors(&self.root, rel)?;
}
let mut remove = resolve_output_roots(task, &self.root, false)?;
remove.extend(manifest.roots.iter().cloned());
let remove = remove_nested_roots(remove);
for rel in &remove {
ensure_no_symlink_ancestors(&self.root, rel)?;
}
let output_matcher = build_output_matcher(&self.root, &task.outputs.patterns())?;
install_transactionally(
&self.root,
staging.path(),
&manifest.roots,
&remove,
Some(&output_matcher),View on GitHub (pinned to 6f52dcdf99)
Solutions
- Delete the cache entry so the next run re-executes the task and writes a fresh artifact
- If it came from a remote store, check the endpoint's artifact integrity and retry after clearing the local staging copy
- Wipe the whole task-artifacts dir when many entries are affected
- Investigate disk space and process kills if saves keep getting interrupted
Example fix
# shell
rm -rf "${XDG_CACHE_HOME:-$HOME/.cache}/task-artifacts/v2/<entry>"
mise run build Defensive patterns
Strategy: fallback
Validate before calling
# verify an archive extracts cleanly before relying on it tar --zstd -tf entry/artifact.tar.zst >/dev/null && echo ok || echo corrupt
Try / catch
Treat as a cache miss: remove the entry (local and, if possible, the remote key), re-run the task to rebuild the artifact, and only then re-enable restore.
Prevention
- Avoid killing mise mid-save
- Check remote cache endpoint reliability if downloads truncate
- Keep the cache volume healthy (space, fsync)
When it happens
Trigger: Truncated archive from a partial download (remote store) or interrupted write (local store); a manifest updated after the artifact was written; extraction silently skipping files. The per-root existence check runs immediately after file::untar with preserve_mtime disabled.
Common situations: Network interruption mid-download from the remote cache; process killed during cache save; zstd decompression issues on a corrupted blob; cache dir on flaky storage.
Related errors
- task cache manifest contains duplicate or nested roots
- task {} cache outputs must not contain source {}
- unsupported task cache store version {}; expected {}
- task cache manifest does not match cache key
- task cache artifact checksum mismatch
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/adda97d7c0169f77.
Report an issue: GitHub.