"<process> failed" and "<process> finished with errors" went to whoever
started any run, including interactive runs whose result screen already
showed the outcome. The listener now notifies only for runs that skip or
fail on frontend steps (scheduled, background, API, queue runs); a run
on the process screens (FrontendStepBehavior.BREAK) sends nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It told people about an API key they had just created. API key expiry,
access-change and share notices stay. newSignIn is unchanged: the qbit
keeps no sign-in history, so the host decides when a device or address
is new; its Javadoc and the docs now say so.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Alert signals are being dropped" had no dedup key, was manual-resolve
and was never re-armed, so it stayed open forever. It now uses a stable
dedup key (the key earlier versions used implicitly, so an alert they
left open resolves too). The drain thread resolves it once the queue has
stayed below half full for a minute and re-arms it, so a later overflow
raises it again. Still ERROR and admin-only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A health blip more than 30 minutes after the last resolve created a new
alert and a second bell entry for the same problem. The reopen window
is now resolved per type: alerts_type.reopenWindowMinutes (changeset
55), else the longest matching prefix in
AlertsQBitConfig.reopenWindowMinutesByTypePrefix (default health. =
360 minutes), else reopenWindowMinutes (30). A reopen updates the
existing alert and its bell entry; flapping detection is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A RESOLVED event reset the alert's bell recipient row to unread, so good
news re-bumped the bell. The in-app channel now updates the entry in
place (title "Resolved: ...") and keeps the read state. A subscription
whose events name RESOLVED and differ from the default set keeps the old
behavior. A reopen suppressed as a duplicate refreshes the entry's text
so it never keeps reading "Resolved". External channels are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>