Context
Surfaced empirically during the post-#10438-merge wake-substrate end-to-end validation (2026-04-27, session b3c0bfb8/c68a7d4b). Bidirectional wake delivery is asymmetric:
- ✅ Gemini → Claude: WAKE event delivered successfully via osascript to
Claude app
- ❌ Claude → Gemini:
[Bridge Daemon] Failed to deliver via osascript: osascript exited with code 1
@tobiu's bridge-daemon log:
[2026-04-27T19:26:45.820Z] [INFO] [Bridge Daemon] Started. Tail-syncing from GraphLog ID: 458157
[2026-04-27T19:28:05.311Z] [INFO] [Bridge Daemon] Delivered WAKE_SUB:4f5ba204-... via osascript to Claude
[2026-04-27T19:29:18.928Z] [ERROR] [Bridge Daemon] Failed to deliver via osascript: osascript exited with code 1
The Problem
ai/graph/identityRoots.mjs:48 sets @neo-gemini-pro's subscriptionTemplate.harnessTargetMetadata.appName = 'Cursor'. But the actual macOS app is Antigravity:
/Applications/ contains Antigravity.app only — no Cursor.app
/Applications/Antigravity.app/Contents/Info.plist: CFBundleName: Antigravity, CFBundleDisplayName: Antigravity, CFBundleIdentifier: com.google.antigravity
- Direct test:
osascript -e 'tell application "Cursor" to activate' → Can't get application "Cursor". (-1728), exit 1
- Direct test:
osascript -e 'tell application "Antigravity" to activate' → exit 0
Antigravity is a fork of Cursor (Google's IDE based on Cursor), but the macOS app's identity is Antigravity. The 'Cursor' template was apparently chosen at #10404 merge time as a placeholder; never empirically validated end-to-end until today's auto-bootstrap shipped + restart cycle completed.
This bug was masked by:
- Earlier sessions had A2A break for OTHER reasons (#10424 cross-process coherence)
- Wake delivery to Gemini's side was rarely tested empirically until #10438 made auto-bootstrap automatic
- The AC for #10402 was reached via a "bootstrap call works" check — never via "wake event reaches recipient" full-loop validation
The Architectural Reality
ai/graph/identityRoots.mjs:48 — the canonical source for Gemini's template
ai/mcp/server/memory-core/services/WakeSubscriptionService.mjs:bootstrap() — reads the template and creates WAKE_SUB nodes inheriting the metadata at subscribe-time (one-shot copy; later template changes don't propagate to existing subs)
ai/scripts/bridge-daemon.mjs:476 (osascript adapter) — reads meta.appName per delivery and fires tell application "${appName}" to activate
- Existing live data:
@neo-gemini-pro AgentIdentity node has subscriptionTemplate.harnessTargetMetadata.appName: 'Cursor'
WAKE_SUB:de10611c (Gemini's auto-bootstrapped sub) inherited the bad value at subscribe-time
The Fix
Two parts:
1. Code fix (canonical source)
ai/graph/identityRoots.mjs:48: appName: 'Cursor' → appName: 'Antigravity'
2. Live-data fix (existing nodes)
The code fix only affects future re-seeds. Existing live data needs explicit patching:
- Update
@neo-gemini-pro AgentIdentity node's subscriptionTemplate.harnessTargetMetadata.appName
- Update
WAKE_SUB:de10611c-bd3a-4ec4-8dc0-49c487a4f5c2's harnessTargetMetadata.appName (created from bad template at boot time post-#10438; metadata is one-shot-copied, doesn't auto-update on template change)
Either via raw SQL UPDATE (one-shot) or via re-seed (seedAgentIdentities.mjs) plus deletion + bootstrap-recreation of Gemini's WAKE_SUB.
Acceptance Criteria
Out of Scope
- Adding
Antigravity to bridge-daemon.mjs:506 default tabShortcut mapping (currently maps 'Cursor' → 'l'). Gemini's template explicitly sets tabShortcut: null, so the default fallback never fires for her. Could be added for symmetry but defer unless it surfaces a separate bug.
- Auditing OTHER identity-root templates for similar app-name placeholder errors (none currently exist; only Gemini's was wrong)
- Adding a runtime validator that checks
tell application <appName> to exists before delivery (architecturally cleaner but bigger scope; the osascript exited with code 1 failure mode is captured in #10425's persistent log, so post-hoc diagnosis is already possible)
Avoided Traps
- Trap: Patch only the bridge-daemon's osascript to retry with alternate names. Avoided: the canonical wrong source is the identity template; daemon-side fallback would mask the data error.
- Trap: Hardcode app-name aliases (
'Cursor' → 'Antigravity'). Avoided: Cursor and Antigravity are distinct apps for distinct users; aliasing would break Cursor users when they emerge.
- Trap: Re-seed without explicit live-data patch. Avoided: existing WAKE_SUB nodes have metadata one-shot-copied from the template at subscribe time; changing the template doesn't propagate to existing subs. Both must be patched explicitly.
Related
- Surfaced by: #10437 / PR #10438 (auto-bootstrap shipped → end-to-end wake delivery testable for first time)
- Original template author: #10404 (closed #10402 with
'Cursor' placeholder that was never empirically validated)
- Persistent diagnostic log substrate that captured the failure: #10419 / PR #10425
Origin Session ID: c68a7d4b-909a-4965-9bf9-116906d271a3
Retrieval Hint: "Gemini identity template appName Cursor Antigravity osascript bridge daemon delivery failure"
Context
Surfaced empirically during the post-#10438-merge wake-substrate end-to-end validation (2026-04-27, session
b3c0bfb8/c68a7d4b). Bidirectional wake delivery is asymmetric:Claudeapp[Bridge Daemon] Failed to deliver via osascript: osascript exited with code 1@tobiu's bridge-daemon log:
The Problem
ai/graph/identityRoots.mjs:48sets@neo-gemini-pro'ssubscriptionTemplate.harnessTargetMetadata.appName = 'Cursor'. But the actual macOS app is Antigravity:/Applications/containsAntigravity.apponly — noCursor.app/Applications/Antigravity.app/Contents/Info.plist:CFBundleName: Antigravity,CFBundleDisplayName: Antigravity,CFBundleIdentifier: com.google.antigravityosascript -e 'tell application "Cursor" to activate'→Can't get application "Cursor". (-1728), exit 1osascript -e 'tell application "Antigravity" to activate'→ exit 0Antigravity is a fork of Cursor (Google's IDE based on Cursor), but the macOS app's identity is
Antigravity. The'Cursor'template was apparently chosen at #10404 merge time as a placeholder; never empirically validated end-to-end until today's auto-bootstrap shipped + restart cycle completed.This bug was masked by:
The Architectural Reality
ai/graph/identityRoots.mjs:48— the canonical source for Gemini's templateai/mcp/server/memory-core/services/WakeSubscriptionService.mjs:bootstrap()— reads the template and creates WAKE_SUB nodes inheriting the metadata at subscribe-time (one-shot copy; later template changes don't propagate to existing subs)ai/scripts/bridge-daemon.mjs:476(osascript adapter) — readsmeta.appNameper delivery and firestell application "${appName}" to activate@neo-gemini-proAgentIdentity node hassubscriptionTemplate.harnessTargetMetadata.appName: 'Cursor'WAKE_SUB:de10611c(Gemini's auto-bootstrapped sub) inherited the bad value at subscribe-timeThe Fix
Two parts:
1. Code fix (canonical source)
ai/graph/identityRoots.mjs:48:appName: 'Cursor'→appName: 'Antigravity'2. Live-data fix (existing nodes)
The code fix only affects future re-seeds. Existing live data needs explicit patching:
@neo-gemini-proAgentIdentity node'ssubscriptionTemplate.harnessTargetMetadata.appNameWAKE_SUB:de10611c-bd3a-4ec4-8dc0-49c487a4f5c2'sharnessTargetMetadata.appName(created from bad template at boot time post-#10438; metadata is one-shot-copied, doesn't auto-update on template change)Either via raw SQL UPDATE (one-shot) or via re-seed (
seedAgentIdentities.mjs) plus deletion + bootstrap-recreation of Gemini's WAKE_SUB.Acceptance Criteria
ai/graph/identityRoots.mjs:48readsappName: 'Antigravity'@neo-gemini-proAgentIdentity node in canonical sqlite hasappName: 'Antigravity'in its subscriptionTemplateWAKE_SUB:de10611c(or its replacement after re-bootstrap) hasappName: 'Antigravity'in its harnessTargetMetadataDelivered ... via osascript to Antigravity(not the previousFailed to deliver via osascript: exit 1)Out of Scope
Antigravitytobridge-daemon.mjs:506defaulttabShortcutmapping (currently maps'Cursor' → 'l'). Gemini's template explicitly setstabShortcut: null, so the default fallback never fires for her. Could be added for symmetry but defer unless it surfaces a separate bug.tell application <appName> to existsbefore delivery (architecturally cleaner but bigger scope; theosascript exited with code 1failure mode is captured in #10425's persistent log, so post-hoc diagnosis is already possible)Avoided Traps
'Cursor' → 'Antigravity'). Avoided: Cursor and Antigravity are distinct apps for distinct users; aliasing would break Cursor users when they emerge.Related
'Cursor'placeholder that was never empirically validated)Origin Session ID: c68a7d4b-909a-4965-9bf9-116906d271a3
Retrieval Hint: "Gemini identity template appName Cursor Antigravity osascript bridge daemon delivery failure"