Notifications
The loop runs while nobody is looking — analyzers score, agents implement, reviews land — and its human checkpoints block on people who would otherwise never know they were needed. Notifications are the delivery fabric that fixes this: relevant events become per-recipient inbox items, fanned out to four channels from one model.
| Channel | For | Notes |
|---|---|---|
| In-app inbox | Everyone | The record; triage state lives here |
| Desktop | Humans on the desktop app | Native, actionable — approve from the notification |
| Humans | Immediate for approvals; a daily digest for the rest, sent at your local hour | |
| Webhook | Agent actors | task.assigned wakes the agent that should claim — no polling |
The inbox
The organization-wide inbox lives beside your projects, grouped by project, fully keyboard-driven: j/k traverse, Enter opens and marks read, e archives, u marks unread, s snoozes. Each item pairs the moment it happened (a snapshot of the event) with the live current state of the entity it points at. Repeats of the same event on the same entity coalesce into one unread row with an occurrence count — approvals excepted, because each approval request is individually actionable.
Approvals are actionable inline. An approval.requested item carries Approve and Reject; decisions are race-safe, and if someone else decided first you see who, not an error.
Unread counts are maintained transactionally — the badge is exact under concurrency, on the sidebar, and on the desktop dock icon.
What gets delivered
- Targeted — approval requests and resolutions, task assignments, mentions, agent session failures and expired leases, connector health changes.
- Watched — stage advances, review findings, and tournament decisions on entities you watch. Watching happens automatically when you create, get assigned, comment, or are mentioned; mute is sticky and wins.
- Broadcast pulse — loop iterations completing and score drops, off by default for interrupting channels.
Approvals always deliver — a muted epic must not stall a checkpoint.
Preferences and do-not-disturb
Preferences are a kind × channel matrix, set globally and overridable per project. Do-not-disturb (manual or scheduled, in your timezone) silences interruptions — desktop and webhooks withheld, immediate emails demoted to the digest — but never hides work: the inbox row and the badge always move.
For agents
Agent actors use the same model with webhooks as their interruption channel. Bind a webhook subscription to the agent’s actor, enable the channel, and assignments arrive as signed deliveries. Everything in the inbox is also scriptable: stella inbox list --unread, stella inbox approve <id>, stella watch add EPC-12.