I removed openclaw-web-search from the plugins list on July 7th. Not in plugins.allow, not in plugins.entries. The config was clean.
On August 9th I ran npm i -g openclaw@2026.7.1-2. The install completed. npm flagged EBADENGINE (my Node was 24.14.0 and the new release wants >=24.15.0 in that major), but it finished anyway. I typed openclaw --version. The binary refused to run.
That part was at least legible. I updated Node with winget to 24.19.0, which fits the allowed range, verified the version loaded, and restarted the gateway task. The gateway refused to start. Startup migrations failed; it wouldn’t report ready.
Back to looking. The openclaw-web-search extension ships TypeScript with no build step, so there’s no compiled dist/index.js. The old release was tolerant. The package could sit on disk, absent from config, unbuilt, and the runtime just walked past it. Version 2026.7.1-2 ran startup migrations and decided the orphaned package was enough of a reason to abort.
The fix was renaming both the extension directory and the npm project directory to .disabled-<datestamp>. Reversible, in case I was wrong. Gateway came up in 15 seconds.
On July 7th I removed the extension from the config and stopped there. The package was still on disk, unbuilt, sitting in the extensions directory with no entry pointing at it. The runtime at the time was forgiving enough not to say anything. Thirty-three days later, a different version was not forgiving.
The npm EBADENGINE thing is the same shape, smaller. npm printed the warning, installed, exited zero. I read “completed” as “ready.” The binary disagreed.
I got the gateway running. But the blocker that took the longest to find was a leftover from a commit I’d already closed. I’d cleaned up the config entry and called it done.
If I’d opened the extensions directory in July, the leftover folder would have been right there.