- Plugin-supplied widgets load as /static/plugin-widgets/...js?v=<plugin
version>, so an update isn't hidden behind the year-long immutable cache.
- Fire-and-forget loadInstalledPlugins() calls catch the rejection it has
already reported, so the global handler no longer adds a second toast.
- Timezone picker renders again when the General partial is re-injected.
- Remove dead code: executePluginAction's six plugin-id fallbacks and
[DEBUG] logging, window.currentPluginConfig and every read of it, the
file-upload JSON delete branch, unused PluginAPI / PluginInstallManager /
PluginStateManager helpers, loadPluginWidgetsFromManifest, the stale
install_manager.js and LEDVisibility fallbacks, error_handler.js's global
escapeHtml, 13 unused CSS rules, and stale comments/no-op returns.
- pytz < 2027, psutil < 7 in requirements-test.txt, pytest-cov < 8.
- Pin anthropics/claude-code-action to the commit v1 resolves to.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>