{"record":{"id":"f886f7b31cda0f68","repo":"jdx/mise","slug":"unsupported-remote-cache-client-metadata-version","errorCode":null,"errorMessage":"unsupported remote cache client metadata version","messagePattern":"unsupported remote cache client metadata version","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/task_cache_store.rs","lineNumber":62,"sourceCode":"    fn from_manifest(manifest: &CacheManifest) -> Self {\n        Self {\n            execution_duration_ns: manifest.execution_duration_ns,\n            output: manifest.output.clone(),\n            restored_bytes: manifest.restored_bytes,\n            roots: manifest\n                .roots\n                .iter()\n                .map(|path| path.to_string_lossy().replace('\\\\', \"/\"))\n                .collect(),\n            task_identity: manifest.task_identity.clone(),\n            kind: \"task\".to_string(),\n            version: 1,\n        }\n    }\n\n    fn into_manifest(self, key: &str) -> Result<CacheManifest> {\n        if self.version != 1 {\n            bail!(\"unsupported remote cache client metadata version\");\n        }\n        if self.kind != \"task\" {\n            bail!(\"remote cache metadata kind is not a task\");\n        }\n        let roots = self.roots.into_iter().map(PathBuf::from).collect();\n        Ok(CacheManifest {\n            format: CACHE_FORMAT_VERSION,\n            key: key.to_string(),\n            task_identity: self.task_identity,\n            artifact_checksum: None,\n            roots,\n            output: self.output,\n            restored_bytes: self.restored_bytes,\n            execution_duration_ns: self.execution_duration_ns,\n        })\n    }\n}\n","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/task/task_cache_store.rs#L44-L80","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Align mise versions across all writers and readers (pin mise in CI and dev environments)","Segment the remote cache by mise version (different prefix or bucket per release) so schemas never mix","If unavoidable, purge the remote entries so current-version metadata is rewritten fresh"],"exampleFix":"# before: one bucket shared across mise versions\nMISE_TASK_CACHE_REMOTE_URL=s3://cache/tasks\n\n# after: prefix keyed by mise version\nMISE_TASK_CACHE_REMOTE_URL=s3://cache/tasks/v2026-01","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"// on unsupported-version metadata, bypass the remote tier and rebuild\nmatch remote_store.get(&key).await {\n    Ok(entry) => entry,\n    Err(e) if e.to_string().contains(\"unsupported remote cache client metadata version\") => {\n        disable_remote_task_cache();\n        local_only_get(&key)\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Segment remote cache URLs by mise major version","Pin mise in CI and note the version next to the cache config","Purge remote caches deliberately as part of version upgrades"],"tags":["mise","task-cache","remote-cache","version"],"backgroundTag":"cache-version-mismatch","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T13:17:26.733Z"}