Repository navigation
fix(goal-loop): stop the status strip from claiming app interaction ownership - #1005
Merged
Merged
Conversation
…wnership - Fixes #1004 The strip stamped data-agent-code-interaction-owner like TldrOverlay, but that marker was designed for full-screen surfaces mounted only while visible; hasAppInteractionOwner() is a document-wide existence query, so a permanently-mounted strip made the keyboard router treat passive status chrome as a modal and swallowed every app shortcut — for the loop's whole life, and across restarts for persisted ended loops. Only the latched overlay keeps the marker; the strip keeps its pointer stopPropagation.
This was referenced Sep 19, 2026
Closed
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
After PR #1003, every app keyboard shortcut dies while any pane shows a goal loop strip: reader mode (Alt+R), Spotlight (Alt+S), the command palette (Cmd+Shift+P), type-to-focus, paste-to-focus and dictation all stop firing — and because ended loops persist across restarts, the dead-keyboard state persists too. (#1004)
Root cause
The goal loop status strip copied TldrOverlay's
data-agent-code-interaction-owner="app"marker. That contract was designed for full-screen blocking surfaces that mount the marker only while visible;hasAppInteractionOwner()is a document-wide existence query, and the keyboard router (useKeybinds.ts:477) admits only the owning surface's dismiss chord while it returns true. A thin, permanently-mounted status bar therefore claimed modal ownership of the whole app.Fix
One line: the strip no longer stamps the marker. Its pointer
stopPropagation(pane click-through protection) is unchanged. The latched overlay keeps the marker — it is a genuine blocking surface, exactly like TldrOverlay. A WHY comment at the strip records the contract so it is not re-copied.Tests and verification
hasAppInteractionOwner()).npx vitest run src/renderer/src/features/goal-loop— 8/8 pass (fails on the pre-fix strip).npx vitest run src/renderer/src/features/tldr/tldr.renderer.test.tsx(the real keyboard-router suite) — 19/19 pass.npm run typecheck— exit 0.Fixes #1004