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

  1. Delete the cache entry so the next run re-executes the task and writes a fresh artifact
  2. If it came from a remote store, check the endpoint's artifact integrity and retry after clearing the local staging copy
  3. Wipe the whole task-artifacts dir when many entries are affected
  4. 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

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


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/adda97d7c0169f77. Report an issue: GitHub.