Artefact: what the researcher would see (macOS banners and the Settings row are system or SwiftUI chrome, approximated, drawn as macOS 27 draws them: icon, title, time, body, no app name; token colours verbatim)Commentary and diagrams: not product
Notificationfinished, Bristlenose in the background
B
Checkout studynow
Analysis finished · 8 sessions · 38m
Notificationdid not finish, reason known
B
Checkout studynow
The analysis didn’t finish · Out of credit · 5 of 8 sessions analysed
Notificationfinished with failures
B
Checkout studynow
Analysis finished with failures · 6 of 8 sessions analysed · 38m
Notificationdid not finish, reason not known
B
Checkout studynow
The analysis didn’t finish · 5 of 8 sessions analysed
SettingsSettings ▸ General, on by default
Default location for new projects
Last location used
Notify when an analysis finishes
SettingsSettings ▸ General, muted
Default location for new projects
Last location used
Notify when an analysis finishes
Sheetfirst analysis: our one-button screen, then the system's request
B

Notify me when analysis finishes

macOS will ask next whether Bristlenose can send notifications. You can change this in Settings > General.

Continue
SettingsSettings ▸ General, notifications off in System Settings
Default location for new projects
Last location used
Notify when an analysis finishesNotifications are off for Bristlenose in System Settings.
Open Notification Settings…

Commentary — not part of the product

For owner scrutiny, not a spec. The text is illustrative and the project is synthetic. Per the owner's direction (6 Nov 2026) the text carries the project name, the switch is on by default, and there is no "about N min".

String plan

TextStatus
"The analysis didn’t finish"Shipped (failedTitle)
"Claude is out of credit"Shape shipped (llmSettings.validation.outOfCredit: "{{provider}} is out of credit…"); the short form is new
Title: the project name; body: "Analysis finished · {{count}} sessions · {{duration}}"New, with a plural. Order follows the owner's own Notification Center (what or where first, then what happened). Sentence case decided by the owner. There is a shipped tooltip "Analysis finished with failures for {{project}}", which is a different case.
"{{project}} · {{count}} sessions · {{duration}}"New, with a plural. Whether the count belongs is open (the same question as a "found so far" count).
Sheet: "Notify me when analysis finishes", "macOS will ask next whether Bristlenose can send notifications. You can change this in Settings > General.", button "Continue"New. Owner-written wording (6 Nov). One button, titled Continue, that opens the system request; no Cancel (Apple's rules for a screen before a permission request). The analysis starts either way.
"Notifications are off for Bristlenose in System Settings." and "Open Notification Settings…"New, owner-written proposals. The button opens the system pane for the app. It never re-asks.
"Notify when an analysis finishes"New, owner-written proposal. Reads positively, on by default. General tab holds one row today.

All new strings need the 21 full locales. Not drawn: the sound. There is no Dock bounce (decided).

When a run's end becomes a banner

Running Finished Didn't finish Stopped (Stop) App quit (⌘Q) Is the researcher lookingat it, or is it muted? Banner + soundclick brings the app forwardthe system's own click behaviour Nothingthe sidebar row flips, as today no, and not muted yes, or muted Stopped: the researcher just pressed Stop. An expected outcome, so no banner."Analysis stopped" stays in the window, as today. App quit: a run stops with the app (R19), so nothing is alive to send one.
The run…Researcher lookingAwayMuted in Settings
finishedno banner; sidebar row flipsbannerno banner
didn't finishno banner; the failure shows as todaybannerno banner
was stopped by the researcherno banner: they just did it, and "Analysis stopped" is already plain
ended because the app quitno banner: nothing is alive to send it (today's rule)

Decided (owner, 6 Nov 2026): when the researcher is looking at Bristlenose (the app is active, a window is visible, the display is awake, the screen is unlocked and the session is active) there is no banner, whichever project is on screen. The researcher is in the app and has the sidebar; a run finishing in another project shows there as it does today. A closed sidebar is a wrinkle to play with once it is built, not a reason to banner.

Still to settle: several runs finishing close together (one banner each, or grouped; macOS can thread them by project); a run that finished while the Mac was asleep (macOS shows it on wake).

Your question: could the web app ask its platform to send the alert? (Parked by the owner, 6 Nov 2026: kept for the record, not being pursued.)

Inside the Mac app bristlenose runwrites the events log PipelineRunner (Swift)knows the run ended, and how Notification CenterUNUserNotificationCenter Banner on this Mac+ sound The web report (React) in the app's web view Report pagehas no run-progress channel(only a data version and lens flags) Bridge to Swiftalready exists for otherpage-to-app messages would reach the same centre, one hop later A browser tab (bristlenose serve, no Mac app) Web Notification APIworks while the tab is open; needsthe browser's own permission the browser raises it iPhone / Apple Watchnot reached by any of these Route 1: a servicethe researcher picks (ntfy…)

Short answer: yes in principle, but it is the wrong place for this one. The thing that knows a run has ended is the Swift side, which already supervises the run; the report page has no run-progress channel at all. Routing it page → bridge → Swift just adds a hop to reach the same notification centre.

Design record: docs/design-perceived-wait.md, candidate A.