LearnNewsExamplesServices
Frontmatter
id10644
titleAntigravity Cmd+L wake-delivery falls through to vscode file write
stateClosed
labels
bugai
assigneesneo-gemini-3-1-pro
createdAtMay 3, 2026, 4:18 PM
updatedAtMay 3, 2026, 5:50 PM
githubUrlhttps://github.com/neomjs/neo/issues/10644
authorneo-opus-4-7
commentsCount2
parentIssue10601
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtMay 3, 2026, 5:50 PM

Antigravity Cmd+L wake-delivery falls through to vscode file write

Closedbugai
neo-opus-4-7
neo-opus-4-7 commented on May 3, 2026, 4:18 PM

Context

Live regression discovered 2026-05-03 ~13:51Z onward, after the restart cycle that surfaced the post-#10632 substrate regressions (#10636 Codex bootstrap, #10641 orphan-spawn, #10638 stderr surface). Operator-anchored:

"geminis a2a is messed up too. not using cmd+l, storing messages inside vscode files. ... we had that working inside our literally previous session. full blown regressions."

Empirical state:

  • bridge.log shows successful delivery to Antigravity's subscription WAKE_SUB:2ac01429... (e.g., 13:50:15Z, 13:51:00Z, 13:55:47Z) — the bridge believes it sent
  • But the wake payload is NOT landing in Antigravity's Composer/Chat panel — it's being written to vscode files instead
  • bridge-daemon.mjs has zero fs.writeFile / file-write fallback code paths for wake delivery (verified by grep) — the file-write behavior MUST originate inside Antigravity's keystroke handler
  • Last confirmed-working delivery to Antigravity (per operator): pre-#10632-restart session, ~12:30Z
  • Last failed-but-bridge-thinks-succeeded delivery: 2026-05-03T13:51Z onward

The Problem

bridge-daemon.mjs:573-575 defaults Antigravity's tabShortcut to 'l' → osascript sends Cmd+L to the frontmost Antigravity process expecting it to focus the Composer/Chat panel. Post-some-IDE-update (Antigravity version drift, possibly a VSCode-fork keybinding change), Cmd+L no longer focuses the chat composer. Likely candidates:

  • Hypothesis A: Antigravity's Cmd+L is now bound to "Highlight current line in editor" (a common VSCode default) — keystroke selects line, then Cmd+A selects all, Cmd+X cuts the editor content, Cmd+V pastes the wake payload INTO the editor, Enter submits → wake payload becomes a file edit instead of a chat message.
  • Hypothesis B: Antigravity's chat panel was reachable via Cmd+L previously but has moved to a different shortcut (e.g., Cmd+I for inline chat, Cmd+K for ask, Cmd+J for panel toggle).
  • Hypothesis C: The "Electron-Paradox Defense" (per bridge-daemon.mjs:578-590) bundle-name vs process-name resolution is off post-update — keystroke is hitting the wrong process tree.

The Architectural Reality

  • Keystroke source: ai/scripts/bridge-daemon.mjs:606-607osascriptArgs.push('-e', \ keystroke "${tabShortcut}" using command down`)`
  • Default lookup: ai/scripts/bridge-daemon.mjs:573-575if (appName === 'Antigravity') tabShortcut = 'l'
  • Per-subscription override: meta.tabShortcut on the WAKE_SUBSCRIPTION node properties; explicit null opts out (no keystroke). See WakeSubscriptionService.mjs validAppNames allow-list.
  • Log entry on success-but-payload-lost: [Bridge Daemon] Delivered WAKE_SUB:2ac01429-... via osascript to Antigravity — bridge confirms delivery because osascript exits 0; the keystroke succeeded but landed in the wrong target.

The Fix

Two-step:

  1. Empirical investigation (REQUIRES IDE-INTERNAL ACCESS): Identify Antigravity's current keybinding for "focus Composer / Chat panel". Best done from inside Antigravity by checking the keybindings registry (Cmd+K Cmd+S to open keybindings settings in VSCode-derived IDEs).
  2. Code fix: Update bridge-daemon.mjs:575 to use the verified shortcut. If the chat panel needs multi-keystroke (e.g., Cmd+Shift+P + type "focus chat" + Enter), the tabShortcut primitive needs extension to support a chord; otherwise a single-keystroke replacement suffices.

Now that PR #10639 has merged (stderr capture), if osascript itself is exiting 1 in any future regression, the stderr will surface in bridge.log and accelerate root-cause identification. For THIS regression, osascript exits 0 (keystroke "succeeded"), so stderr capture doesn't directly help — but the empirical investigation can use osascript's tell application "System Events" to ... get keybindings reflection to confirm the new binding without inspecting the IDE settings UI.

Acceptance Criteria

  • Verified current Antigravity keybinding for chat-composer focus, documented in PR body with osascript reflection or screenshot evidence
  • bridge-daemon.mjs:573-575 updated to use the verified shortcut (or extended to support chord if needed)
  • Test coverage: integration test against the bridge with a mock Antigravity adapter that asserts the keystroke matches the documented shortcut. (Existing bridge-daemon.spec.mjs test "skips osascript delivery and logs error when appName is missing" suggests a pattern.)
  • Manual end-to-end verification: tobi observes that an A2A wake to Gemini's subscription paste-lands in the Antigravity chat composer, NOT in a vscode file
  • Anchor & Echo block on the tabShortcut default block captures: "Antigravity Cmd+L was the canonical shortcut pre-IDE-version-X; replaced with Cmd+Y because IDE-version-X+ rebound Cmd+L to "

Out of Scope

  • Adding a fallback file-write path for wake delivery — explicitly anti-pattern; if the keystroke target is wrong, the payload should NOT land in some random file
  • Changing Claude Desktop's tabShortcut default ('3') — that path is verified working
  • Codex bootstrap fix — covered by #10636 / PR #10637
  • Detecting Antigravity version drift dynamically (over-engineering; static shortcut update suffices)

Avoided Traps

  • Trap: "Add a Cmd+Shift+P → Focus Chat chord as a defensive fallback." Rejected. Adds complexity to the keystroke primitive; the right shape is a single verified shortcut. If chord support is genuinely needed, file as a separate substrate ticket.
  • Trap: "Detect IDE version at runtime and route differently." Rejected. Antigravity ships as a single product; the canonical shortcut should be unambiguous at any given Neo.mjs release. If shortcut changes again post-merge, file a follow-up; don't pre-engineer for hypothetical future drift.
  • Trap: "Switch to MCP-based wake delivery to bypass keystroke injection entirely." Out of scope for this fix. Substrate-rearchitecture lives in the wider auto-wakeup substrate epic #10601.

Related

  • Parent: #10601 (auto-wakeup substrate Epic — native SUB_ISSUE link to follow)
  • Sibling: #10638 / PR #10639 — merged (bridge stderr surface — diagnostic adjacency, doesn't directly help here since osascript exits 0)
  • Sibling: #10641 / PR #10642 (staleness-branch removal — separate post-restart regression)
  • Sibling: #10636 / PR #10637 (Codex validAppNames — separate post-restart regression on a different harness)
  • Loose anchor: bridge-daemon.mjs:578-590 Electron-Paradox Defense (prior keystroke-routing investigation)

Author Routing

Best author: @neo-gemini-3-1-pro — empirical investigation requires IDE-internal access (Antigravity is her harness). Gemini investigates the new keybinding from inside Antigravity, then authors the PR. Filing this ticket scaffold so she has a Fat-Ticket starting point per the Swarm A2A memory bridge protocol.

Origin Session ID

Origin Session ID: 9766f91c-51f8-44fe-ac34-d79f61a0e1bf

Retrieval Hint

query_raw_memories("Antigravity Cmd+L vscode file write wake delivery regression") or bridge.log entries between 2026-05-03T13:51Z and 13:55Z showing successful-osascript-delivery to Antigravity that did NOT reach the chat composer. Empirical operator quote captured in #10641's diagnostic round.

tobiu referenced in commit 8f5bdc4 - "feat(ai): add wake safety gate and circuit breaker (#10648) (#10653) on May 3, 2026, 5:40 PM
tobiu referenced in commit 37670aa - "fix(ai): change Antigravity focus shortcut to Cmd+Shift+I (#10644) (#10652) on May 3, 2026, 5:50 PM
tobiu closed this issue on May 3, 2026, 5:50 PM
tobiu referenced in commit 7a7d362 - "docs(agentos): add wake substrate incident protocol (#10650) (#10655) on May 3, 2026, 7:00 PM
tobiu referenced in commit 73dfaf6 - "fix(ai): extend focus seed default to Codex (#10662) (#10663) on May 3, 2026, 10:00 PM