{"record":{"id":"2c1ff934b66234d3","repo":"github/spec-kit","slug":"registry-entry-for-extension-id-missing-or-cor","errorCode":null,"errorMessage":"Registry entry for '{extension_id}' missing or corrupted after install — update incomplete","messagePattern":"Registry entry for '(.+?)' missing or corrupted after install — update incomplete","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/extensions/_commands.py","lineNumber":2203,"sourceCode":"                    manager.remove(extension_id, keep_config=True)\n\n                    # 8. Install new version\n                    _ = manager.install_from_zip(archive_path, speckit_version)\n\n                    # Restore user config files from backup after successful install.\n                    new_extension_dir = manager.extensions_dir / extension_id\n                    if backup_config_dir.exists() and new_extension_dir.exists():\n                        for cfg_file in backup_config_dir.iterdir():\n                            if cfg_file.is_file():\n                                shutil.copy2(cfg_file, new_extension_dir / cfg_file.name)\n\n                    # 9. Restore metadata from backup (installed_at, enabled state)\n                    if backup_registry_entry and isinstance(backup_registry_entry, dict):\n                        # Copy current registry entry to avoid mutating internal\n                        # registry state before explicit restore().\n                        current_metadata = manager.registry.get(extension_id)\n                        if current_metadata is None or not isinstance(current_metadata, dict):\n                            raise RuntimeError(\n                                f\"Registry entry for '{extension_id}' missing or corrupted after install — update incomplete\"\n                            )\n                        new_metadata = dict(current_metadata)\n\n                        # Preserve the original installation timestamp\n                        if \"installed_at\" in backup_registry_entry:\n                            new_metadata[\"installed_at\"] = backup_registry_entry[\"installed_at\"]\n\n                        # Preserve the original priority (normalized to handle corruption)\n                        if \"priority\" in backup_registry_entry:\n                            new_metadata[\"priority\"] = normalize_priority(backup_registry_entry[\"priority\"])\n\n                        # If extension was disabled before update, disable it again\n                        if not backup_registry_entry.get(\"enabled\", True):\n                            new_metadata[\"enabled\"] = False\n\n                        # Use restore() instead of update() because update() always\n                        # preserves the existing installed_at, ignoring our override","sourceCodeStart":2185,"sourceCodeEnd":2221,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/extensions/_commands.py#L2185-L2221","documentation":"Error \"Registry entry for '{extension_id}' missing or corrupted after install — update incomplete\" thrown in github/spec-kit.","triggerScenarios":"Thrown at src/specify_cli/extensions/_commands.py:2203 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Repair or reinstall the extension so its registry entry exists and is valid, then retry the update."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}