{"record":{"id":"9e24089f3fd2d430","repo":"zed-industries/zed","slug":"mismatched-versions","errorCode":null,"errorMessage":"mismatched versions: ({}) != ({})","messagePattern":"mismatched versions: \\((.+?)\\) != \\((.+?)\\)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/extension_host/src/headless_host.rs","lineNumber":132,"sourceCode":"                    .retain(|id| !on_client.contains(id.as_ref()));\n                let mut to_remove = store\n                    .loaded_extensions\n                    .keys()\n                    .filter(|id| !on_client.contains(id.as_ref()))\n                    .cloned()\n                    .collect::<Vec<Arc<str>>>();\n                to_remove.extend(store.failed_removals.drain());\n                let to_load = extensions\n                    .into_iter()\n                    .filter(|extension| {\n                        let is_new = store\n                            .loaded_extensions\n                            .get(extension.id.as_str())\n                            .is_none_or(|loaded| {\n                                loaded.version.as_ref() != extension.version.as_str()\n                            });\n                        extension.dev || is_new\n                    })\n                    .collect::<Vec<ExtensionVersion>>();\n                (to_remove, to_load)\n            })?;\n\n            let mut extensions_changed = false;\n            let result = async {\n                let mut missing = Vec::new();\n\n                for extension_id in to_remove {\n                    log::info!(\"removing extension: {extension_id}\");\n                    let (was_loaded, removal) = store.update(cx, |store, cx| {\n                        (\n                            store.loaded_extensions.contains_key(&extension_id),\n                            store.uninstall_extension(&extension_id, cx),\n                        )\n                    })?;\n                    if was_loaded {\n                        extensions_changed = true;","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/zed-industries/zed/blob/9d272b036335401f339d024ea94968fd51016c40/crates/extension_host/src/headless_host.rs#L114-L150","documentation":"The headless extension host (used server-side, e.g. in collab) loads each built-in extension and cross-checks the version parsed from the extension's extension.toml against the version recorded in the compiled-in built-in extension registry entry. A mismatch bails with both values so a half-updated build fails fast instead of serving a stale extension.","triggerScenarios":"The version in the extension's manifest was bumped (or reverted) without updating the corresponding version in the built-in extensions list compiled into the host, or vice versa; building with a mismatched extensions checkout/submodule.","commonSituations":"Release automation that updates extension manifests but not the registry (or the reverse); manual edits to one side; rebasing across an extension version bump; stale build artifacts after pulling.","solutions":["Identify which side changed recently: the extension's extension.toml version or the built-in extensions registry entry.","Make both values identical (usually bump the registry entry to the new manifest version).","cargo clean / rebuild so the compiled-in registry is regenerated, then re-run the headless host."],"exampleFix":"# before: manifest says version = \"0.2.0\" while the built-in registry entry says \"0.1.0\"\n# after: keep them in lockstep — update the registry entry to \"0.2.0\" (or revert the manifest) and rebuild","handlingStrategy":"validation","validationCode":"let manifest = ExtensionManifest::load(fs.clone(), &extension_dir).await?;\nanyhow::ensure!(\n    manifest.version.as_ref() == extension.version.as_str(),\n    \"manifest {} != registry {}: keep both in sync\",\n    manifest.version,\n    extension.version\n);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Bump the built-in registry entry and the extension manifest version in the same commit.","Add a test that loads every built-in extension and asserts version equality with the registry.","Rebuild fully after pulling changes that touch built-in extensions."],"tags":["version","extension","manifest","builtin","headless"],"backgroundTag":"version-mismatch","analyzedSha":"9d272b036335401f339d024ea94968fd51016c40","analyzedAt":"2026-08-20T19:29:52.058Z","contentChangedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}