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-607 — osascriptArgs.push('-e', \ keystroke "${tabShortcut}" using command down`)`
- Default lookup:
ai/scripts/bridge-daemon.mjs:573-575 — if (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:
- 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).
- 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
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.
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:
Empirical state:
bridge.logshows successful delivery to Antigravity's subscriptionWAKE_SUB:2ac01429...(e.g., 13:50:15Z, 13:51:00Z, 13:55:47Z) — the bridge believes it sentbridge-daemon.mjshas zerofs.writeFile/ file-write fallback code paths for wake delivery (verified by grep) — the file-write behavior MUST originate inside Antigravity's keystroke handlerThe Problem
bridge-daemon.mjs:573-575defaults Antigravity'stabShortcutto'l'→ osascript sendsCmd+Lto 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+Lno longer focuses the chat composer. Likely candidates:Cmd+Lis now bound to "Highlight current line in editor" (a common VSCode default) — keystroke selects line, thenCmd+Aselects all,Cmd+Xcuts the editor content,Cmd+Vpastes the wake payload INTO the editor, Enter submits → wake payload becomes a file edit instead of a chat message.Cmd+Lpreviously but has moved to a different shortcut (e.g.,Cmd+Ifor inline chat,Cmd+Kfor ask,Cmd+Jfor panel toggle).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
ai/scripts/bridge-daemon.mjs:606-607—osascriptArgs.push('-e', \keystroke "${tabShortcut}" using command down`)`ai/scripts/bridge-daemon.mjs:573-575—if (appName === 'Antigravity') tabShortcut = 'l'meta.tabShortcuton the WAKE_SUBSCRIPTION node properties; explicitnullopts out (no keystroke). SeeWakeSubscriptionService.mjsvalidAppNamesallow-list.[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:
Cmd+K Cmd+Sto open keybindings settings in VSCode-derived IDEs).bridge-daemon.mjs:575to use the verified shortcut. If the chat panel needs multi-keystroke (e.g.,Cmd+Shift+P+ type "focus chat" + Enter), thetabShortcutprimitive 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.logand 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'stell application "System Events" to ... get keybindingsreflection to confirm the new binding without inspecting the IDE settings UI.Acceptance Criteria
bridge-daemon.mjs:573-575updated to use the verified shortcut (or extended to support chord if needed)bridge-daemon.spec.mjstest "skips osascript delivery and logs error when appName is missing" suggests a pattern.)tabShortcutdefault block captures: "Antigravity Cmd+L was the canonical shortcut pre-IDE-version-X; replaced with Cmd+Y because IDE-version-X+ rebound Cmd+L toOut of Scope
tabShortcutdefault ('3') — that path is verified workingAvoided Traps
Cmd+Shift+P → Focus Chatchord 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.Related
SUB_ISSUElink to follow)validAppNames— separate post-restart regression on a different harness)bridge-daemon.mjs:578-590Electron-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")orbridge.logentries 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.