Что админ читает по клику на колокольчик: лента in-app — личный срез доставленных событий, статус прочтения, действия. Каналы, маршруты и типы — на экране настроек уведомлений; механика доставки — в диспетчере.
read_at IS NULL). Счётчик обновляется мгновенно push-каналом (SSE), опрос — фоновый добор. Канал in-app залочён включённым, поэтому колокольчик есть всегда — лента = notifications ⋈ deliveries.
read_at всем доставкам админа разом; шестерёнка ведёт в настройки каналов и маршрутов (правит только Owner).
×N, не N строк. Ключ и окно — тротлинг диспетчера.
notifications.meta). Событие общее для всех Owner / Admin, а действие глобальное, поэтому оно идемпотентно: источник истины по охвату — allow-list Harvester; контейнер уже в scope → повтор ничего не делает, а кнопка «В scope» гаснет у всех. Само уведомление состояние действия не хранит — журнал не мутируется ради этого. Живёт только в режиме scope «Только выбранное»; в режиме «Всё» объект подхватывается сам — тогда это просто инфо.
notifications.severity (critical · warning · info), цвет из каталога событий. Тип слева — категория маршрутизации (Sync · Security · Budget · System · Discovery).
source_ref: прогон, источник, провайдер, бюджет. Уводит туда, где чинят, прямо из ленты.
read_at в собственную доставку админа — у каждого своя лента и свой read-state, чужие не трогаются. Само событие — append-only, его не правят и не удаляют.
security и sync, отключается у себя в профиле (notification_prefs), личных замков нет. Организационный замок этих двух держит in-app включённым лишь на уровне организации — централизованно не погасить, но личного выбора он не ограничивает.