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
Email 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.