3d10ed385c
An async bridge_send(wait:false) registers a rendezvous waiter, so its reply always takes MessageService.reply's fast path and returns before ReplyPushLoop.onReplyQueued is ever called — the exact mode the charter tells leads to prefer never nudged. Add ReplyPushLoop.onTicketTerminal(ticket, target, failed), a second entry point reusing the loop's status gating, bounded/backoff reminders and metrics, keyed by the nudge-receiving lead so several tickets finishing together coalesce into one nudge naming the count. MessageService wires it via task.future.whenComplete in sendAsync (covers reply, completion fallback, wedge, and abandon() alike) and calls the new ticketCollected(ticket) from poll() once a terminal view is handed back, so an already-collected ticket is never nudged again. The CB-307 inbox path (onReplyQueued/decide/NUDGE_FORMAT) is untouched.