Skip to content

ADR 0143: Intercom — participant lens ленты (All / Humans / Agents / System)

Статус: Accepted
Дата: 2026-05-24

Связанные ADR

ADR Роль
0080 Intercom как канал; роли human / agent / system
0045 Event log — полный log; lens = проекция
0123 Skia chrome + лента; lens в chrome, не в скролле
0127 Spine + topic tabs; lens — ортогональная ось в том же chrome
0142 Wire по sender_role; lens не transport channel
0119 IntercomMessageAudience.SelfOnly vs Channel — доставка, не lens
0132 Export/MCP — полный log, без фильтра lens
0144 Transport v1 — human fan-out; lens Agents/System остаются локальными

Вне ADR

Документ / код Роль
intercom-ux-reference-slack-mattermost-v1.md Flat feed, role rail — lens дополняет, не пузыри
IntercomMessageAudience Audience = кому доставлено сообщение; не путать с lens

Резюме

Принято: в Intercom вводится participant lens (вид ленты) — переключатель в Skia chrome, который фильтрует отображение сообщений текущей темы по роли отправителя:

Lens Показывает
All human + agent + system (по умолчанию)
Humans только human
Agents только agent
System только system (сборка, git, MCP-статус, slash-outcome и т.п.)

Lens — клиентская проекция над event log; не отдельные комнаты в transport, не дублирование topic, не замена IntercomMessageAudience.Channel.


Контекст

В длинной теме лента смешивает реплики людей, агента и системные строки. Оператору нужно быстро:

  • читать только команду (Humans);
  • разбирать только ход агента (Agents);
  • смотреть только инфраструктурный шум (System) — CI, git, tool status;
  • или видеть всё (All).

Идея «каналов Agent/Humans» обсуждалась в связи с 0142; без фиксации границ возникает путаница с:

  • topic (0072) — о чём линия работы;
  • IntercomMessageAudienceкому доставлено (Channel / SelfOnly);
  • transport channel (Matrix room, MM channel) — слой B 0132.

Решение

1. Термины (нормативно)

Термин Значение
Participant lens (FeedParticipantLens) UI-фильтр ленты по sender_role
Topic Линия работы / тред; lens применяется внутри выбранной темы
Audience Доставка исходящего (Channel | SelfOnly); ортогонально lens
Transport channel Внешний store (Matrix/MM); не lens

В продуктовом тексте не называть lens «каналом» без уточнения «вид ленты».

2. Модель lens

flowchart LR
  subgraph log["Event log (полный)"]
    H[human]
    A[agent]
    S[system]
  end
  subgraph lenses["Participant lens (chrome)"]
    All[All]
    Hum[Humans]
    Ag[Agents]
    Sys[System]
  end
  log --> All
  H --> Hum
  A --> Ag
  S --> Sys
FeedParticipantLens Предикат на сообщение
All всегда true
Humans role == human
Agents role == agent
System role == system

Роль — та же, что в wire 0142 и event types 0045. Новое поле в событии не требуется для v1.

Классификация system: при записи события отправитель уже помечен system (build, git, orchestration, локальный slash-outcome в ленте с меткой «Система» — см. intercom-ux-reference). Lens не переклассифицирует задним числом.

3. UI и chrome (0127)

  • Переключатель lens — в Skia chrome (segmented control / chips), над скроллом ленты, рядом с topic tabs / spine — не внутри Items ленты.
  • По умолчанию: All.
  • Сохранение: последний lens — в [code_navigation_map]-подобной секции или [intercom] в settings (имя TOML — при внедрении); опционально per-topic память (v1.1).
  • Пустая лента: явная подпись «Нет сообщений для Humans» + опционально «N скрыто» при активном фильтре ≠ All.
  • Role rail (0123): при узком lens все видимые строки одной роли — rail может схлопываться или оставаться (продуктовый выбор при реализации; default — оставить для единообразия hit-target).

4. Composer и исходящие сообщения

Правило Содержание
Lens ≠ адресация Выбор Humans не означает «отправить только людям»
Compose По-прежнему в общий поток темы (IntercomMessageAudience.Channel), если не задан иной audience
SelfOnly Slash / /helpSelfOnly; не показываются в lens Humans/Agents/System, только в All (или отдельная политика: SelfOnly всегда только локально и не в export)

Приватная адресация «только агенту» — не этот ADR; отдельное расширение audience/recipient при необходимости.

5. Wire, transport, MCP

Слой Поведение
Локальный log Хранит все события
Projection / Skia feed Применяет lens
Export / MCP / 0132 Полный log без lens
Matrix/MM bridge Не создаёт отдельные room per lens

6. Клавиатура (опционально v1.1)

Melody/Chords — по аналогии с 0127: цикл lens или прямые chord’ы (Ctrl+K → S → …) — отдельный шаг intent-catalog при внедрении; v1 достаточно клика в chrome.


Последствия

Положительные

  • Меньше когнитивного шума без разбиения store и без дублирования topics.
  • System отдельно — удобно для «что упало в CI» без прокрутки диалога агента.
  • Согласуется с 0142: роль на wire, проекции на клиенте.

Отрицательные / риски

  • Пользователь может не заметить скрытые сообщения — нужен счётчик/подпись.
  • Четыре lens + topic tabs + spine — риск перегруза chrome; compact Forward — приоритет 4 коротких метки (All / Hum / Agt / Sys) или иконки + tooltip.

Не цели

  • Отдельные transport-каналы или Matrix rooms per lens.
  • Замена topic navigation или spine.
  • Фильтрация export/MCP по lens.
  • Переименование IntercomMessageAudience.Channel в этом ADR.

Anti-patterns

Anti-pattern Почему
Хранить только отфильтрованные сообщения в log Ломает export, ветвление, rewind 0116
Lens меняет sender_role Роль — факт события
«Канал Agents» в UI без слова «вид» Путаница с MM/Matrix и Audience.Channel
Скрыть system внутри Humans System — отдельный lens (принято здесь)

Фазы

Фаза Содержание
v1 Enum + chrome switcher + фильтр projection; default All; подпись пустого состояния
v1.1 Persist lens в settings; chord в intent-catalog
v2 Per-topic remembered lens; badge «N hidden»

Отклонённые альтернативы (кратко)

Альтернатива Почему не принято
Три lens без System (system в All/Humans) Запрос продукта: System отдельно
System внутри Agents Смешивает tool-loop и CI/git
Отдельные sub-logs в БД Дорого; lens достаточно
Slack-style channels как store 0142, 0132

История

Дата Изменение
2026-05-24 Accepted: participant lens All / Humans / Agents / System; client projection; не transport channel.