jdx/mise · error

unsupported remote cache client metadata version

Error message

unsupported remote cache client metadata version

What it means

Remote cache entries carry a client-metadata blob with a version field; RemoteClientMetadata::into_manifest only accepts version 1. A different version means the entry was written by a mise release with an incompatible metadata schema, and deserializing it as v1 could mis-restore outputs, so it is rejected.

Source

Thrown at src/task/task_cache_store.rs:62

    fn from_manifest(manifest: &CacheManifest) -> Self {
        Self {
            execution_duration_ns: manifest.execution_duration_ns,
            output: manifest.output.clone(),
            restored_bytes: manifest.restored_bytes,
            roots: manifest
                .roots
                .iter()
                .map(|path| path.to_string_lossy().replace('\\', "/"))
                .collect(),
            task_identity: manifest.task_identity.clone(),
            kind: "task".to_string(),
            version: 1,
        }
    }

    fn into_manifest(self, key: &str) -> Result<CacheManifest> {
        if self.version != 1 {
            bail!("unsupported remote cache client metadata version");
        }
        if self.kind != "task" {
            bail!("remote cache metadata kind is not a task");
        }
        let roots = self.roots.into_iter().map(PathBuf::from).collect();
        Ok(CacheManifest {
            format: CACHE_FORMAT_VERSION,
            key: key.to_string(),
            task_identity: self.task_identity,
            artifact_checksum: None,
            roots,
            output: self.output,
            restored_bytes: self.restored_bytes,
            execution_duration_ns: self.execution_duration_ns,
        })
    }
}

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Align mise versions across all writers and readers (pin mise in CI and dev environments)
  2. Segment the remote cache by mise version (different prefix or bucket per release) so schemas never mix
  3. If unavoidable, purge the remote entries so current-version metadata is rewritten fresh

Example fix

# before: one bucket shared across mise versions
MISE_TASK_CACHE_REMOTE_URL=s3://cache/tasks

# after: prefix keyed by mise version
MISE_TASK_CACHE_REMOTE_URL=s3://cache/tasks/v2026-01
Defensive patterns

Strategy: fallback

Try / catch

// on unsupported-version metadata, bypass the remote tier and rebuild
match remote_store.get(&key).await {
    Ok(entry) => entry,
    Err(e) if e.to_string().contains("unsupported remote cache client metadata version") => {
        disable_remote_task_cache();
        local_only_get(&key)
    }
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: get() downloads the CLIENT_METADATA_MEDIA_TYPE blob, parses it, and its 'version' field is not 1 when into_manifest runs — i.e. the remote store holds entries written by a newer or older mise.

Common situations: Team or CI machines on different mise versions sharing one remote cache bucket; rolling upgrades; stale entries from an earlier beta of task artifact caching.

Related errors


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/f886f7b31cda0f68. Report an issue: GitHub.