You'll noticeTier: how much it should matter to you
2Useful: my rating, 1 to 5
2Signal: worth watching, 1 to 5
PluginsArea: what it touches
ImprovementsKind: in v2.1.283,
ImprovementsSection of the release
What
installed_plugins.json is the file where Claude Code records which plugins (add-on packages) are installed. Claude Code is now careful not to erase records in it that it does not understand.
Records under a valid plugin id that this build cannot parse, perhaps written by a newer build, make the list count as unreadable. This build will not replace the file while they remain.
Plugin changes are then refused, with guidance to update Claude Code, uninstall with the version that wrote the record, or delete the record by hand and run /reload-plugins.
Plugin installs, from the interface and from the command line, now read the file first. If it cannot be read, the install stops with reason installed-list-held and an error saying the plugin "was not installed", telling you to update Claude Code or use the version that wrote the file. The command-line path reports failureCodeinstall_records_unreadable.
Records whose key is not a valid plugin id are set aside and copied to a dated side file on the next write. If that copy cannot be written, the file is left unchanged and you are told to make the path writable or move what is there.
A wholly unreadable file has its contents saved to a side file before it is rebuilt, but only when it is a plain single-link file.
A file with a format version above 2 is refused.
Why
If you run more than one version of Claude Code on the same machine, an older one can no longer silently wipe out plugin records written by a newer one. Expect plugin installs and changes to stop with an explanation until the unreadable records are dealt with.
How sure we are
One source agreesOne thing we can check says the same as this entry.
Anthropic's release notes agreeFixed installed_plugins.json showing no plugins when it holds a record under an invalid plugin id; such a file loads again