2026-08-08 The Gemini Completion Nothing Had Turned Off
What I set out to do
Chase a reported bug: gemini-backed autocompletion was still firing in Neovim despite having been turned off. The working hypothesis going in was that the plugin got set up at import time and so survived whatever disabled it.
What I actually did
Traced the completion stack instead of assuming the hypothesis. Three coupled
points kept it alive, all in nvim/lua/plugins/:
minuet.luasetprovider = "gemini"andblink.enable_auto_complete = trueblink_cmp.lua:1hardcoded"minuet"intodefault_sourcesblink_cmp.lua:19declaredmilanglacier/minuet-ai.nvimas a dependency of blink.cmp
The third point is the trap, and it is the grain of truth in the original
hypothesis. Because minuet was a blink.cmp dependency, lazy.nvim loaded it at
startup no matter what happened to minuet.lua’s own spec — deleting the file,
enabled = false, adding a lazy trigger, none of it would have mattered. blink
would still call the minuet.blink source because the source name was baked
into default_sources. The off-switch had to live in blink_cmp.lua.
Then the correction to the premise: nothing had ever turned it off.
git log -S"minuet" --all -- nvim/ returns exactly three commits, all of which
added it (87f21c1, 1628d49, fe4a5bc). Whatever “turning it off” happened
was runtime-only or never committed.
Fix, once the user confirmed they wanted the AI source gone and the rest kept:
dropped minuet from default_sources, from the providers table, and from
blink’s dependencies; deleted minuet.lua and its lazy-lock.json entry.
Verified with a headless nvim probe before and after — before: minuet loaded: true, sources included minuet; after: false, sources are
lsp/path/snippets/buffer. just check passed.
What was striking
Two things that both look like configuration but are not.
minuet.lua carried a top-level auto_complete = true, which reads exactly
like the master switch and is in fact an inert key — minuet’s real schema only
has cmp.enable_auto_complete, blink.enable_auto_complete, and virtualtext
(the live gate is checked at lua/minuet/blink.lua:30). Anyone flipping that
key to false would have watched nothing happen and reasonably concluded the
plugin was broken.
And the dependency edge is invisible from the file you would naturally go edit.
The name of the thing you want off appears in minuet.lua; the reason it stays
on appears in blink_cmp.lua. Declaring a plugin as another plugin’s dependency
quietly removes it from its own spec’s control — a specific case of the general
rule that a component should be declared where it is used.
Worth noting the premise check paid for itself here. Had I gone straight to “restore the disabled state,” there was no disabled state to restore, and I’d have been reconstructing a change that never existed.
Related
Related to 2026-07-02 Neovim 0.12 Config Fixes and lua_ls Split-Root and 2026-08-05 Claude Follow-Mode Split the Tabpage Root Instead of Claude’s Window.