You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The vercel Claude Code plugin injects "MANDATORY" skill suggestions on essentially every prompt and tool call in this repo. Most of them are false positives — we're a Cloudflare Workers / Bun / D1 project, not a Vercel one.
Root cause
Two Vercel plugin installations were registered on this machine and the older one was doing the injection:
vercel@claude-plugins-official:
- scope: user → version 0.40.0 (no PreToolUse/UserPromptSubmit hooks registered)
- scope: local → version 2e79fc9698b0 (pre-0.32 commit, full injection hooks still registered)
projectPath: /Users/zachdunn/Code/rally
installPath: ~/.claude/plugins/cache/claude-plugins-official/vercel/2e79fc9698b0
vercel/vercel-plugin#57 dropped the injection hooks in 0.40.0. Its hooks.json only registers SessionStart / SessionEnd. But the older install's hooks.json still registered:
PostToolUse, SubagentStart, SubagentStop — more injection points
When /plugin reported "vercel is already at the latest version (0.40.0)" it was reading the user-scope install and silently ignoring the stale project-scope one. Both hook registrations were active simultaneously, so the old hooks fired on every prompt and tool call globally.
Why this repo lights it up so hard (separate issue)
Even with the old install cleaned up, the plugin's active-matching design scores generously on generic vocabulary. In our case:
workers/api/** matches the api/** path pattern → triggers vercel-functions.
.github/workflows/** → triggers workflow (Vercel's WDK skill) and deployments-cicd.
package.json / bun.lock basenames → trigger bootstrap and next-upgrade.
Generic words in prompts (deploy, env, cache, frozen, broken, check) trigger lexical-recall matches. allOf: [broken, check] +4 alone is enough.
Our own files: reading wrangler.jsonc fires vercel-functions. Reading package.json fires bootstrap and next-upgrade. Reading .github/workflows/*.yml fires workflow and deployments-cicd.
Progress (2026-04-17)
Local machine now clean. Steps taken:
Disabled vercel for the rally project in /Users/zachdunn/Code/rally/.claude/settings.local.json via /plugin — the local-scope install got upgraded from the pre-0.32 commit to 0.40.0 in the process.
Ran /reload-plugins — plugin host picked up the new state (25 plugins / 18 hooks reloaded).
Deleted orphan cache dirs that still had old injection-enabled hooks.json content on disk:
Note: even after all of the above, injection hooks continued to fire in the session that was already running when the fix landed. Hook registrations appear to be captured at Claude Code session start — /reload-plugins updates plugin definitions but does not appear to deregister already-live hooks. Starting a fresh Claude Code session in this repo should be clean. If it isn't, we know there's a deeper issue to file upstream.
When a newer plugin version supersedes an older install at a different scope, the plugin host should deregister the older install's hooks — otherwise chore: add custom domain route for API worker #57's fix silently doesn't take effect for users with multi-scope installs.
Even on 0.40.0+, a repo-level opt-out (via .claude/settings.json or CLAUDE.md) for the injection signals would be useful — "this project is not a Vercel app; suppress injections."
Injection scoring on generic basenames (package.json, api/**, .github/workflows/*) and generic prompt vocabulary (deploy, broken, check) is too loose; consider requiring stronger signal (Vercel-related deps present, .vercel/ directory, next.config.*, etc.) before matching.
Workaround / kill switch
/plugin → disable vercel@claude-plugins-official at user scope. Confirmed clean once the orphan cache dirs are gone and a fresh session is started.
The
vercelClaude Code plugin injects "MANDATORY" skill suggestions on essentially every prompt and tool call in this repo. Most of them are false positives — we're a Cloudflare Workers / Bun / D1 project, not a Vercel one.Root cause
Two Vercel plugin installations were registered on this machine and the older one was doing the injection:
vercel/vercel-plugin#57 dropped the injection hooks in 0.40.0. Its
hooks.jsononly registersSessionStart/SessionEnd. But the older install'shooks.jsonstill registered:PreToolUse(matcherRead|Edit|Write|Bash) →pretooluse-skill-inject.mjsUserPromptSubmit→user-prompt-submit-skill-inject.mjs+user-prompt-submit-telemetry.mjsPostToolUse,SubagentStart,SubagentStop— more injection pointsWhen
/pluginreported "vercel is already at the latest version (0.40.0)" it was reading the user-scope install and silently ignoring the stale project-scope one. Both hook registrations were active simultaneously, so the old hooks fired on every prompt and tool call globally.Why this repo lights it up so hard (separate issue)
Even with the old install cleaned up, the plugin's active-matching design scores generously on generic vocabulary. In our case:
workers/api/**matches theapi/**path pattern → triggersvercel-functions..github/workflows/**→ triggersworkflow(Vercel's WDK skill) anddeployments-cicd.package.json/bun.lockbasenames → triggerbootstrapandnext-upgrade.deploy,env,cache,frozen,broken,check) trigger lexical-recall matches.allOf: [broken, check]+4 alone is enough.wrangler.jsoncfiresvercel-functions. Readingpackage.jsonfiresbootstrapandnext-upgrade. Reading.github/workflows/*.ymlfiresworkflowanddeployments-cicd.Progress (2026-04-17)
Local machine now clean. Steps taken:
/Users/zachdunn/Code/rally/.claude/settings.local.jsonvia/plugin— the local-scope install got upgraded from the pre-0.32 commit to0.40.0in the process./reload-plugins— plugin host picked up the new state (25 plugins / 18 hooks reloaded).hooks.jsoncontent on disk:0.40.0remains under that directory now.installed_plugins.jsonshows both installs at 0.40.0 and the local-scope install disabled:Note: even after all of the above, injection hooks continued to fire in the session that was already running when the fix landed. Hook registrations appear to be captured at Claude Code session start —
/reload-pluginsupdates plugin definitions but does not appear to deregister already-live hooks. Starting a fresh Claude Code session in this repo should be clean. If it isn't, we know there's a deeper issue to file upstream.Upstream
Filing the platform-level observations at vercel/vercel-plugin:
.claude/settings.jsonorCLAUDE.md) for the injection signals would be useful — "this project is not a Vercel app; suppress injections."package.json,api/**,.github/workflows/*) and generic prompt vocabulary (deploy,broken,check) is too loose; consider requiring stronger signal (Vercel-related deps present,.vercel/directory,next.config.*, etc.) before matching.Workaround / kill switch
/plugin→ disablevercel@claude-plugins-officialat user scope. Confirmed clean once the orphan cache dirs are gone and a fresh session is started.