Intercom UX: ориентиры Slack / Mattermost (границы v1)¶
Статус: черновик продуктового направления (не ADR).
Дата: 2026-05-17
Связь: ADR 0080 (канал, multi-party, внешний командный контур §5), ADR 0072 (topic cards, drill-in/back), ADR 0119 (слэш + autocomplete в ChatInput), ADR 0031, ADR 0096, ADR 0057, ADR 0044, ADR 0120, north-star-cursor-mcp-cascade-workbench-v1.md.
Зачем этот документ¶
Intercom в CascadeIDE — не «чат с ботом», а канал связи в сессии работы (0080). Пользователи и команды уже знают Slack и Mattermost: composer внизу, слэш-команды, треды, роли сообщений.
Этот чертёж фиксирует, какие паттерны брать как вдохновение для UX в IDE, и что сознательно не копировать (сервер чата, «одна бесконечная лента», короткие мнемоники в слэше). Норматив по исполнению остаётся в ADR; здесь — продуктовая рамка для дизайна и приоритизации.
Два слоя (не смешивать)¶
| Слой | Что это | Ориентир Slack/MM |
|---|---|---|
| A. Intercom в IDE | Сессия + агент + workspace + MCP; Skia pipeline 0057 | Паттерны UI и поведения, не бэкенд |
| B. Внешний командный контур | Люди вне IDE, организация, retention, мобилки | Mattermost / Matrix / корп. API — интеграция, не переписывание (0080 §5) |
Документ в основном про слой A. Слой B — отдельный ADR интеграции, когда будет продуктовый коммит.
Что заимствуем (in scope для UX)¶
Composer и command line¶
- Поле ввода внизу (или закреплённый composer в Forward при 0120) — привычная «точка речи» сессии.
- Слэш-команды с иерархическим autocomplete (
/→ namespace → action), как в Slack — 0119. Discoverability через подсказки, не через запоминание/br. - Обычный текст без ведущего
/уходит агенту; слэш — локальное действие IDE/Intercom (Reject неизвестного/, без pass-through агенту).
Навигация по темам (сильнее, чем «просто лента»)¶
- Topic cards + overview/detail + back 0072 — аналог «списка каналов/тредов», но заточен под линии работы в сессии, а не произвольные комнаты.
- Одна тема → default detail; несколько тем → default overview карточек.
- Main line — одна из карточек, не скрытый режим «без карточек».
Типы сообщений и «кто в эфире»¶
| Тип (продуктово) | Примеры | Заметка |
|---|---|---|
| Human | оператор | |
| Agent | LLM / ACP | |
| System | сборка, git, MCP-статус, ошибка инструмента | визуально отличать от диалога (как system/bot в MM) |
| (будущее) Operator external | реплика из Mattermost | слой B, синхронизация по контракту |
Минимум v1: заложить тип сообщения в модель событий 0045, даже если в UI пока только human + agent.
Плотность и читаемость ленты¶
- Хронология внутри темы; ветвления — данные 0031, не хаотичные прыжки UI.
- Карточка темы со сводкой 0096 — аналог preview последнего сообщения в списке каналов.
- Product spine — ортогонален main thread; не смешивать с обычной лентой без явного действия.
Лента без «пузырей» (как Slack/MM, не как Telegram)¶
У Slack и Mattermost в канале нет messenger-пузырей (цветные «шарики» слева/справа) — плоская лента: аватар (опционально) + имя + время + текст на фоне канала. У Cascade Intercom целевое направление — то же: пузыри отвлекают от кода и смысла реплики; лишний визуальный шум в Forward.
| Делаем | Не делаем |
|---|---|
| Большинство реплик — одна плоская строка, без рамки и без заливки | Оформлять каждое сообщение как «карточку» |
| Роль human / agent / system — типографика (имя, цвет метки, плотность), не balloon | Залитые rounded bubble вокруг каждой реплики |
| Акцент редко: рамка / inset только когда есть смысл прервать (ошибка, блокер, результат слэша, diff) | Рамка «для красоты» или на каждую реплику агента |
| System / slash-outcome — по умолчанию компактная строка; рамка — только при ошибке или явном статусе | Псевдо-диалог «два собеседника в шариках» |
Правило акцента: если рамкой/inset помечено больше малой доли ленты, акцент теряет смысл — как в Dark Cockpit (handbook §2.5): в норме лента тихая, прерывание — по делу.
Текущее состояние: в коде/теме ещё есть legacy message_bubble / ChatMessageBubbleBackground (Avalonia/Skia) — долг на эволюцию к flat feed (0123). В макетах для дизайнера — не рисовать Telegram/iMessage-пузыри; ориентир — скриншот Slack (плоская лента).
Исключение термина: в ADR про слэш иногда «пузырь» = одна строка результата /command в ленте (не chat-bubble); при рефакторинге лучше «slash outcome row».
IDE-специфичное «богатое сообщение» (не копия Slack)¶
- Якоря на файл / диапазон / выделение (0080 future) — превью, jump-to-code, мини-diff.
- Паритет: то же действие через MCP/
command_id, что и клик в Intercom.
Входы (ортогональность)¶
Один command_id — несколько поверхностей (0013, handbook §2.6):
| Вход | Роль |
|---|---|
| Pointer / hit-target | тактика на карточках |
| Палитра (Ctrl+Q) | репетиция: полный каталог, fuzzy-поиск |
CascadeChord (Ctrl+K) + Melody c: |
выступление: мнемоники в палитре/аккорде, не в слэше |
| Chat slash + autocomplete | канал сессии: CLI в composer (0119 Implemented) |
| MCP / агент | тот же command_id 0030 |
Что не копируем (out of scope / non-goals)¶
| Не делаем | Почему |
|---|---|
| Сервер Slack/MM внутри Cascade | 0080 §5: отдельный продукт |
| WebView полного клиента MM/Slack в IDE без ADR | «Две правды», фокус, SSO — только осознанно |
| Одна бесконечная лента как единственный режим | Ломает topic cards 0072 |
Короткие слэш-мнемоники (/br) |
Discoverability только autocomplete; сжатие — c: Melody |
| Messenger-пузыри (Telegram/iMessage-style) | Отвлекают; у Slack/MM их нет — flat feed; акцент — рамка/inset, см. §«Лента без пузырей» |
| Реакции, GIF, emoji-first | Шум для IDE-цикла; отложить |
| Полный поиск по истории как в MM Enterprise | v2+; не блокер v1 Intercom |
| Паритет каждой фичи MM (threads в threads, workflows) | Берём ментальную модель, не feature checklist |
Карта паттернов: Slack/MM → Cascade¶
| Паттерн Slack / Mattermost | В Cascade Intercom |
|---|---|
| Channel list | Topic overview (карточки) 0072 |
| Thread | Тема / ThreadNode 0031 |
/command + picker |
0119 |
| @mention | Якорь на код / workspace context (будущее) |
| Сообщение в канале (flat) | Строка ленты: имя + время + текст; без balloon |
| Bot / system message | System role + build/git/MCP lines (компактно, не пузырь) |
| Pin / bookmark | Spine, session tree 0116 |
| Unread badge | IDE Health / уведомления кабины (не дублировать MM) |
Skia и «ощущение Slack»¶
0044 / 0057: вдохновение — иерархия экранов, composer, типографика, плоская лента + системные строки, а не HTML-виджеты Slack и не messenger-пузыри. Pipeline Intent → Layout → Render сохраняет intent-first 0072 §5: pointer и слэш не дергают Skia напрямую.
Визуальные ориентиры v1 (мягкие):
- human / agent — различимые роли (цвет имени, иконка), без balloon; без рамки на обычной реплике;
- system / slash-outcome — по умолчанию компактная строка; рамка/inset — исключение (ошибка, fail, требует действия);
- topic card — заголовок + сводка + метаданные (время, непрочитанное — по мере готовности модели).
Приоритеты внедрения (согласовано с ADR)¶
| Приоритет | Содержание | ADR |
|---|---|---|
| P0 | Topic cards, drill-in/back, adaptive default | 0072 |
| P0 | Слэш + обязательный autocomplete; без коротких слэш-алиасов | 0119 |
| P1 | Типы сообщений (system/agent/human) в ленте | 0045, 0080 |
| P1 | Intercom-centric Forward (опционально) | 0120 |
| P2 | Rich anchors (file:line, selection) | 0080 future, 0039 |
| P3 | Внешний MM/Slack как канал команды | 0080 §5, отдельный ADR |
Открытые вопросы¶
- Sidebar vs overview в Forward: при 0120 — карточки тем слева (MM-style) или полноэкранный overview?
- Имя в UI: только «Intercom» или подзаголовок «как в командном чате» на первый релиз? 0080 open.
- Минимальный набор system-сообщений v1: только build fail/success или шире (git, index)?
- Критерии выбора внешнего провайдера (слой B): self-host, API, SSO — до ADR интеграции.
История¶
| Дата | Изменение |
|---|---|
| 2026-05-17 | Черновик: Slack/Mattermost как UX-ориентир; границы A/B; in/out of scope; карта паттернов. |
| 2026-05-19 | Лента без messenger-пузырей (flat feed как Slack); акцент редко (рамка/inset); legacy bubble — долг. |