Five findings from the manual validation pass, all in-branch: 1. LSP-only words never queried the server: the auto-open path fired request_completion only when the sync providers already produced rows. An empty sweep now leaves a pending session and the request always fires; isIncomplete responses re-request on further typing. Corollary: attachment_for_request now flushes-if-attached but NEVER attaches -- the first cut wrapped attached_for_active, which spawns servers on demand, i.e. per-keystroke spawn attempts in unattached buffers (wedged the parallel m4 suite; serial ran 3x slower). Attachment stays buffer-open policy. 2. Cross-buffer LSP leak: the built-in provider's no-uri fallback was the legacy global store drain, so scratch/unattached buffers could show another file's cached completions. Strict now: no uri, no rows. 3. Pending prefixes own the keyboard: Action::Pending (C-x ...) dismisses the popup and the popup shadow is guarded on an empty dispatcher prefix, so the sequence's continuation and its C-g abort reach the dispatcher instead of the popup. 4. Window-scoped sessions: CompletionPopupState.window_id (stamped by completion_popup_open; Lua never sees it). Only the owning window's overlay paints -- same-buffer splits each carry a persistent overlay -- and a focus change invalidates the session. 5. Flaky worker test: the /proc thread-count probe and the idempotence check both build EditorStates and could run concurrently, polluting the baseline; merged into one test (non-Linux keeps a portable idempotence variant). Regression tests for 1-4; framing doc gains the as-built notes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| api | ||
| commands | ||
| hooks | ||
| keymaps | ||
| menus | ||
| packages/repl | ||
| runtime | ||