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.lua set provider = "gemini" and blink.enable_auto_complete = true
  • blink_cmp.lua:1 hardcoded "minuet" into default_sources
  • blink_cmp.lua:19 declared milanglacier/minuet-ai.nvim as 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 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.