Closed bug report

Mac: a mirrored approval dialog closes itself 3 s after it opens ("no longer pending on Adom Bridge") while Bridge still holds the request; the Dock bounce stays and leads to an empty Hydrogen

Drew Owens · 6d ago ·edited ·closed by Kyle Bergstedt

@kyle, on Drew's Mac an AI's shell approval request reached Hydrogen in 30 ms, but Hydrogen closed its dialog about 3 seconds later, both times. The Dock icon kept bouncing, so when Drew came back and clicked it, Hydrogen came forward with nothing to approve.

Versions (2026-11-04)

  • Hydrogen for Mac 0.1.428 (build 57c84e0c, dirty; insiders tier, public flavor; its updater says it is on the latest)
  • Adom Bridge for macOS 1.9.232, embedded under Hydrogen (launch flag); status reports embeddedPolicy auto-approve
  • macOS 27.2 (26B123), MacBook Air (Mac16,12)
  • Caller: an AI in a cloud container using the adom-bridge relay CLI 2.1.185
  • The latest on the wiki: adom/hydrogen-macos 0.1.428 (the dev line is also at 0.1.428), adom/adom-bridge-macos 1.9.232. I found no fix released and no open issue for this.

What Drew saw

"hydrogen app icon bounced up from dock, but when I clicked on it it showed me the app but request surfacing in Bridge took about a minute"

What the logs show

  1. 20:15:46Z. An AI called request_shell_approval over the relay. Bridge mirrored it to Hydrogen at once: Hydrogen logged perm_mirror_request at 20:15:46.974Z, and Bridge logged shown in Hydrogen (displayed: true).
  2. 20:15:49.962Z, 2.99 s later, Hydrogen closed it: [permission] self-heal closed dialog (id=grant-2420d9053746414eb2c39cbc14403969): no longer pending on Adom Bridge Bridge still held that request: it logged Shell approval card grant-2420... expired unanswered only at 20:20:46Z, 300 s in.
  3. 20:47:52.774Z. Drew clicked the bouncing Hydrogen Dock icon ([app] Reopen - restoring windows). Nothing was pending in either app at that moment.
    • Neither log has any event in the 38 s before that click.
    • The only prompt in the half hour before it was the 20:15:46Z one.
    • So the bounce was most likely the attention request for that dialog, still on 32 minutes after the dialog closed itself.
  4. 20:48:25.885Z, 33 s after the click. The AI asked again, because Drew told it to. This is the gap Drew called "about a minute".
    • Hydrogen got the mirror at 20:48:25.910Z.
    • The self-heal closed this dialog too, at 20:48:28.903Z (2.99 s).
    • Bridge still accepted a human allow_24h for that same id at 20:48:35.53Z. Only after that did it send perm_mirror_dismiss (three of them, 20:48:35.544Z to .563Z).

The relay, Bridge and the mirror were not slow (about 30 ms end to end). The time went to the dialog closing early and the Dock bounce pointing at nothing.

Timeline (UTC)

Time Where Event Source
20:15:46.942 Bridge request_shell_approval {wait:true, timeoutSec:600} arrives (grant-2420...) permission_history seq 13; Bridge log L2897
20:15:46 Bridge warning notification; its window created, Regular policy (Dock icon), window shown Bridge log L2898 to L2902
20:15:46.974 Hydrogen perm_mirror_request received; Bridge: displayed: true Hydrogen log L783; Bridge log L2905
20:15:49.962 Hydrogen self-heal closes the dialog: "no longer pending on Adom Bridge" Hydrogen log L784
20:16:13 to 20:25:39 caller status polled every 10 s, 57 times: willPrompt true, source none caller-side.md
20:20:46 Bridge card "expired unanswered" (the request was still live until here) Bridge log L3047
20:47:52.774 Hydrogen Drew clicks the bouncing Dock icon; nothing to approve Hydrogen log L859
20:48:25.885 Bridge the AI asks again (grant-d3cc...); warning notification permission_history seq 14; Bridge log L3468
20:48:25.910 Hydrogen perm_mirror_request received; Bridge: displayed: true Hydrogen log L862; Bridge log L3472
20:48:28.903 Hydrogen self-heal closes this dialog too Hydrogen log L863
20:48:35.533 Bridge allow_24h by a human, applied to grant-d3cc... permission_history seq 15; Bridge log L3481 to L3483
20:48:35.544 to .563 Hydrogen three perm_mirror_dismiss from Bridge (the first has id "" and decision "granted") Hydrogen log L864 to L866

From the click to the new prompt: 33.1 s. From the click to the approval: 42.8 s.

Expected

  • A mirrored prompt stays on screen (as a dialog or a bell row) until Bridge dismisses it with perm_mirror_dismiss, or until it really expires.
  • Whenever the Dock icon bounces for a prompt, that prompt is there to click.

Asks

  1. Don't close a dialog in the 3 s self-heal while Bridge still holds the request.
    • A request_shell_approval prompt (type grant-request, held:false) stays live on Bridge for 300 s, not 3 s.
    • Wait for perm_mirror_dismiss or for the expiry Bridge reports, or ask Bridge about that id before closing.
    • The early close is right for the adom/adom-bridge#1212 case, where the gated call had already returned and Bridge had dropped the prompt.
  2. Clear the Dock attention request whenever a permission dialog closes, whatever the reason: decided, dismissed, self-heal or expired.
  3. Leave a bell row when a prompt closes without a decision ("expired" or "closed, no longer pending"), so someone who comes back can see what happened.
  4. Log the attention request and its cancel, with the prompt id. Also log the user's decision on a mirrored prompt: the log has the request and the self-heal close but nothing at 20:48:35Z.

Which side

  • The early close is Hydrogen's code.
  • The "no longer pending" answer it acts on comes from Bridge 1.9.232.
  • Bridge's side (the silent 300 s expiry, a pending answer that leaves out live grant requests, the mirror coming back through Hydrogen) is filed on adom/adom-bridge-macos with the same timeline.

To confirm the bounce

  • Does the permission dialog path request user attention (critical), and does the self-heal close cancel it?
  • Repro on a test Mac:
    1. Put Hydrogen in the background.
    2. Call request_shell_approval from a relay caller.
    3. Don't touch the Mac for 5 s.
    4. Expect the dialog to be gone and the icon still bouncing.

Attachments

  • hydrogen-log-excerpt.txt: Hydrogen's log lines with UTC added (the file is in Mac local time, UTC-6)
  • bridge-log-excerpt.txt: Bridge's log lines (UTC)
  • startup-log-excerpt.txt: Bridge's FOREGROUND and PERMISSION lines
  • permission-history-excerpt.json: permission_history rows 7 to 15
  • caller-side.md: the caller's replies, its status polls and the relay timing

Companion issue, Bridge's side of the same timeline: https://wiki.adom.inc/adom/adom-bridge-macos/issues/8

Filed by Drew's AI agent at his request.

hydrogen-log-excerpt.txt

bridge-log-excerpt.txt

startup-log-excerpt.txt

permission-history-excerpt.json

caller-side.md

1 Reply

Kyle Bergstedt closed this · 4d ago
Kyle Bergstedt reopened this · 4d ago
Kyle Bergstedt · 4d ago

fixed in 0.1.429-dev.12: the self-heal compared bridge's pending entries as strings but they are objects, so every dialog closed on the first poll. now it matches by id and needs two misses, clicks relay to bridge, the dock bounce is cancelled when the last dialog closes, and a prompt that closes undecided leaves a row in the menu-bar center. requests, cancels and decisions are logged with the id

Kyle Bergstedt closed this · 4d ago

Log in to reply.