[BUG] Plugin drop reason, ui.log and toast are not shown in the mobile app over Remote Control

Status Open
Reported on v2.1.294
Maintainer reply None cached
Activity 0 comments · opened Oct 8, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

When a plugin's prompt.submit hook drops a prompt that came from the Claude mobile app over Remote Control (e.origin.kind === 'bridge'), the mobile app shows nothing. The prompt is gone, no reason is shown, and to the person on the phone it looks as if Claude stopped responding.

The plugin API docs say of { drop: reason }: "The text is shown to the user as the reason." In the terminal it is (Prompt dropped by a hook: …), but not on the phone. $.ui.log and $.ui.toast from the same hook also show only in the terminal.

I hit this with a plugin that holds prompts during a ten-minute break (cogload): from the phone, the break is invisible.

What Should Happen?

The mobile app shows a dropped prompt's reason, as the terminal does, so a plugin can tell a Remote Control user why their prompt did not go through.

Error Messages/Logs

⏺ phone-probe: probe 2/4: transcript line (from bridge)
⏺ phone-probe: probe 4/4 result: {"result":{"message":"probe 4/4: push notification","pushSent":true,"localSent":true,"sentAt":"2026-10-08T06:25:51.989Z"},"text":"Terminal notification sent. Mobile push requested."}
⏺ Prompt dropped by a hook: probe 1/4: drop reason

All of the above appears in the terminal; none of it appears in the mobile app.

Steps to Reproduce

  1. Create a plugin with this hooks module (hooks/hooks.json: { "modules": ["./register.ts"] }):

```ts
import type { Register } from 'claude-code'

export const register: Register = on => {
on('prompt.submit', async ($, e, next) => {
if (e.text.trim().toLowerCase() !== 'probe') return next(e)
$.ui.log(probe 2/4: transcript line (from ${e.origin.kind}))
$.ui.toast('probe 3/4: toast')
await $.tool
.call({ tool: 'PushNotification', message: 'probe 4/4: push notification', status: 'proactive' })
.then(r => $.ui.log(probe 4/4 result: ${JSON.stringify(r).slice(0, 300)}))
return { drop: 'probe 1/4: drop reason' }
})
}
```

  1. Load it (claude --plugin-dir <folder>) and connect the session to the Claude mobile app with Remote Control.
  2. Send probe from the mobile app.
  3. The terminal shows the drop reason, the log line and the toast. The mobile app shows nothing: the sent prompt simply disappears.

Claude Model

Opus

Is this a regression?

I don't know

Claude Code Version

2.1.294 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Other (Ghostty)

Additional Information

Related, possibly a separate bug: in the same probe, PushNotification returned pushSent: true and "Mobile push requested", but no notification arrived on the phone (notifications are enabled for the Claude app; nothing in Notification Center). An earlier run returned disabledReason: "user_present" while I was using the phone, not the terminal. So a plugin currently has no channel that reaches a Remote Control user.

Claude subscription (Max); the mobile app is the iOS Claude app.

View original on GitHub ↗