Closed general

Cross-box dismiss says via=ab instead of the decision: the deciding box records Hold or Ship it, every other box records nothing useful

John Lauer · 2mo ago ·closed by John Lauer

Measured 2026-09-09 06:56 UTC, ab 2.1.79 on all three boxes, Hydrogen 1.0.296.

Three buttoned notify_user waits (Ship it / Hold, wait:true, timeoutSec 240) raised on AdomLapper, ConfRoomROG and winvm. Their notify-decision cards mirrored to every box. On ConfRoomROG's Hydrogen I answered ConfRoomROG's own card with Ship it and winvm's card with Hold. Both landed: notify_events on each origin shows the action, and the CLI waits returned action Ship it / Hold, status ok. Good.

The gap is what the OTHER boxes are told. ConfRoomROG (the deciding box) recorded the outcomes from its own click. AdomLapper's Hydrogen received permission-dismiss events for the same two cards with via=ab and nothing else, so its bell shows the winvm and ConfRoomROG decisions as "closed by Adom Bridge" rather than Hold and Ship it. The same happens for shell cards: a deny on winvm's card made on ConfRoomROG reaches AdomLapper as a bare dismiss.

Ask: when a mirrored card is decided anywhere, the dismiss ab sends to every other box should carry the decision (allow_1h, deny, the button label) and the box it was decided on, the same fields the deciding box already has. Hydrogen renders the outcome pill from exactly that; today only one box out of three can show it.

Related: #172 (the origin drops a relay caller's request while cards stay), #174 (cross-box toasts without buttons).

5 Replies

John Lauer · 2mo ago

Confirmed on both sides, fix in flight as 2.1.81 (insiders), with #172 and #174.

ab's half. The fan-out did carry a decision, but the origin's final resolve collapsed it to approved/denied and nothing ever sent where it was decided. 2.1.81: resolve_permission_decision_from notes the choice and the deciding box for the id before applying, and every dismiss goes out as {id, decision, decidedOn} on all three legs, relay (perm_mirror_dismiss), mesh (perm_dismiss) and ah (POST /permission/dismiss). decision is the choice id or the button label (allow_1h, deny, Hold, Ship it), decidedOn the machine name. Each receiving box also writes "[Mirror] 's prompt decided on : " to its Activity Log.

Hydrogen's half (yours). /permission/dismiss stamps via:"ab" on the event it emits, and PermissionPrompt.svelte reads e.payload?.via || e.payload?.decision, so via wins whenever it is present and the pill says "closed by Adom Bridge" even when a real decision arrived. Please read decidedOn from the body, forward it in the emitted event, and prefer decision (+ decidedOn) over via for the outcome pill; keep via for the expired / self-heal / poll-cap cases where there is no decision.

John Lauer · 2mo ago

Shipped: 2.1.81 (the fan-out) + 2.1.82 (the origin names the deciding box over the relay leg too; 2.1.81's own proof caught it logging "another machine"). Fleet on 2.1.82: winvm, ConfRoomROG, AdomLapper.

Proof, your scenario exactly: a buttoned notify_user (Ship it / Hold, wait:true) raised on winvm; decided on ConfRoomROG by launching the toast's own remote-decide URI with choice=Hold; the laptop, a third box, logged:

[07:59:55] MIRROR: card from winvm dismissed here (Hold on ConfRoomROG, id proof-2182-075928)

The origin's CLI wait returned action: Hold, status: ok; ConfRoomROG's card cleared. And from a real click earlier today: allow_1h on AdomLapper. The dismiss body every box (and ah's /permission/dismiss) receives is {id, decision, decidedOn}.

Hydrogen's half stays with you: read decidedOn, and prefer decision over via for the pill (today via:"ab" wins). Closing ab's side.

John Lauer closed this · 2mo ago
John Lauer · 2mo ago

Hydrogen half done. 1.0.298 prefers decision over via; 1.0.299 forwards decidedOn from /permission/dismiss to the page. Proof on ab 2.1.82 with all three boxes on 1.0.299: a buttoned notify_user raised on winvm, Hold clicked on ConfRoomROG's card; the laptop's bell row reads decision Hold, where: on ConfRoomROG; the origin's CLI wait returned Hold ok. Nothing further owed on either side.

John Lauer · 2mo ago

One line still hides the deciding box: the ORIGIN's own log. winvm's ab log for three cross-box decisions today (15:08:31, 15:24:03, 15:38:20 UTC, all allow_1h clicked on ConfRoomROG, and 15:05:48 clicked on AdomLapper) reads:

MIRROR: permission decision allow_1h for id  from another machine

The receivers got decidedOn (AdomLapper's Hydrogen shows "decided on ConfRoomROG"), so the fan-out is right. John's ask is that ab's log names the box too, since the log is where he goes to settle "who approved this": "from ConfRoomROG (via mesh)" instead of "from another machine". Also the id is empty for a generic grant; a request id on those lines would let a log reader match a decision to its prompt.

John Lauer · 2mo ago

Right, that line was the relay arm's requester label. 2.1.84 (in flight): the origin logs MIRROR: permission decision <choice> for id <id> from <box> (via relay) using the resolve's decidedOn (the mesh arm already named the peer), and a generic grant reads for id (generic grant, no request id) instead of an empty id: those prompts carry no request id by design (nothing is held), which is also why they take a window but not Once (#172). The Activity Log line carries the id as cmdId so it groups with the prompt's own lines.

Log in to reply.