# Отчёт о проделанной работе — Surfaces Team

**Проект:** Lambda Lab 3.0 — Surfaces
**Дата:** 2026-04-01
**Период:** 2026-03-28 — 2026-04-01

---

## 1. Цель этапа

Собрать работоспособный прототип двух поверхностей для взаимодействия пользователя с AI-агентом Lambda:

- **Telegram-бот** — основная пользовательская поверхность
- **Matrix-бот** — альтернативная децентрализованная поверхность

Ключевое требование: не ждать готовности платформенного SDK, а двигаться вперёд через собственный контракт и мок-реализацию. Это позволило вести параллельную разработку UX, архитектуры и интеграции без блокировки на внешние зависимости.

---

## 2. Архитектура

### 2.1. Общее ядро (`core/`)

Выделен независимый от транспорта слой, используемый обеими поверхностями:

| Компонент | Файл | Назначение |
|-----------|------|-----------|
| Протокол событий | `core/protocol.py` | `IncomingMessage`, `OutgoingMessage`, `OutgoingUI` и др. |
| Диспетчер | `core/handler.py` | `EventDispatcher`: маршрутизация событий → обработчики |
| Обработчики | `core/handlers/` | `start`, `message`, `chat`, `settings`, `callback` |
| Хранилище состояний | `core/store.py` | `InMemoryStore`, `SQLiteStore` |
| Менеджмент чатов | `core/chat.py` | `ChatManager` |
| Аутентификация | `core/auth.py` | `AuthManager` |
| Настройки | `core/settings.py` | `SettingsManager` |

Telegram и Matrix — тонкие адаптеры: принимают транспортные события, конвертируют в формат ядра, передают в `core`, рендерят ответ обратно.

### 2.2. Платформенный контракт (`sdk/`)

Вместо ожидания SDK Lambda зафиксирован собственный контракт:

- `sdk/interface.py` — Protocol: `PlatformClient`, `WebhookReceiver`
- `sdk/mock.py` — `MockPlatformClient` (заглушка с симулируемой латентностью)

При подключении реального SDK заменяется только `sdk/mock.py` — core и адаптеры не трогаются.

> **Примечание:** в процессе работы директория `platform/` была переименована в `sdk/` для устранения конфликта имён со стандартной библиотекой Python (`platform.python_implementation`). Все импорты обновлены.

### 2.3. Структура репозитория

```
surfaces-bot/
  core/               — общее ядро
  sdk/                — платформенный контракт и мок
  adapter/
    telegram/         — Telegram-адаптер (worktree: feat/telegram-adapter)
    matrix/           — Matrix-адаптер (в main)
  docs/
    superpowers/
      specs/          — утверждённые спецификации
      plans/          — планы реализации
    research/         — исследования API и архитектурных вариантов
    reports/          — отчёты
  tests/              — pytest (70 тестов)
```

---

## 3. Telegram: итоги

### 3.1. Что реализовано

**Базовый DM-режим (полностью работает):**

| Функция | Команда/механизм |
|---------|-----------------|
| Онбординг | `/start` — создание первого чата, восстановление сессии |
| Создание чатов | `/new [название]` |
| Список чатов | `/chats` — инлайн-кнопки с переключением |
| Диалог | Любое сообщение → мок-ответ `[MOCK] Ответ на: «...»` |
| Typing indicator | `send_chat_action("typing")` + обновление каждые 4 сек |
| Настройки | `/settings` → меню: скиллы, личность агента, безопасность, подписка |
| Подтверждения | `confirm:yes/<id>` / `confirm:no/<id>` через `InlineKeyboard` |
| Список команд | Зарегистрирован через `set_my_commands()` |
| Вложения | Конвертируются в `Attachment` (фото, документ, голос) |

**Forum Topics режим (реализован поверх DM):**

| Функция | Описание |
|---------|----------|
| Подключение группы | `/forum` → FSM онбординг → пересылка сообщения из супергруппы |
| Проверка прав | Бот должен быть администратором с `can_manage_topics` |
| Синхронизация | При подключении группы создаются темы для всех DM-чатов |
| Регистрация темы | `/new` в forum-теме регистрирует её как чат |
| Создание с синхронизацией | `/new` в DM + подключённая группа → создаёт и DM-чат, и forum-тему |
| Маршрутизация | Пришло из DM → ответ в DM с тегом `[Чат #N]`; из темы → ответ в тему без тега |

**Ключевые принятые решения:**
- Основной режим — виртуальные чаты в DM (нулевое friction)
- Forum Topics — opt-in advanced mode, не обязательный
- Бот не создаёт группы сам (Telegram Bot API не позволяет)
- Один контекст (`chat_id` = UUID) для обеих поверхностей

### 3.2. Техническая реализация

```
adapter/telegram/
  bot.py          — Dispatcher, DispatcherMiddleware, регистрация роутеров
  states.py       — ChatState, SettingsState, ForumSetupState
  db.py           — SQLite: tg_users + chats (включая forum_group_id, forum_thread_id)
  converter.py    — from_message(), is_forum_message(), resolve_forum_chat_id()
  handlers/
    auth.py       — /start
    chat.py       — сообщения, /new, /chats, forum-маршрутизация
    settings.py   — /settings, скиллы, личность, безопасность, подписка
    confirm.py    — подтверждение действий агента
    forum.py      — /forum, онбординг, регистрация группы
  keyboards/
    chat.py       — список чатов
    settings.py   — меню настроек, скиллы, безопасность
    confirm.py    — кнопки ✅/❌
```

**Исправленные баги:**
- Команды (`/new`, `/settings` и др.) обрабатывались как обычные сообщения — исправлено фильтром `~F.text.startswith("/")`
- Конфликт `platform/` с stdlib Python — устранён переименованием в `sdk/`

### 3.3. Документация

- Спецификация DM-режима: `docs/superpowers/specs/2026-03-31-telegram-adapter-design.md`
- Спецификация Forum Topics: `docs/superpowers/specs/2026-03-31-forum-topics-design.md`
- План реализации Forum Topics: `docs/superpowers/plans/2026-03-31-forum-topics.md`
- Исследования: `docs/research/telegram-chat-alternatives.md`, `docs/research/telegram-forum-topics.md`

### 3.4. Открытые задачи

- Edge-cases forum synchronization (частично закрыты агентами после лимита)
- Ручной QA форум-сценариев
- Слияние `feat/telegram-adapter` → `main`

---

## 4. Matrix: итоги

### 4.1. Что реализовано

- Matrix bot entrypoint (`adapter/matrix/bot.py`)
- Converter layer (Matrix events → `IncomingEvent`)
- Room metadata store
- Маршрутизация входящих событий
- Обработка реакций
- Обработка приглашений (invite → DM onboarding)
- Platform-aware command hints (`/start` для Telegram, `!start` для Matrix)
- Модель room-per-chat: команда `!new` создаёт **реальную Matrix room**

### 4.2. Архитектурный сдвиг: Space-first → DM-first

Изначально рассматривалась модель Space-first (персональный Space + settings-room + отдельные комнаты внутри Space). По ходу реализации выбран более прагматичный первый этап:

- **DM-first onboarding**: пользователь приглашает бота → бот приветствует → первый контекст привязывается к C1
- **Room-per-chat**: `!new` создаёт реальную Matrix room, бот приглашает пользователя

Это соответствует принципу: каждый чат — отдельная сущность транспорта, не только внутренняя запись.

### 4.3. Критические баги, исправленные в ходе работы

| Баг | Причина | Исправление |
|-----|---------|-------------|
| Бот не принимал invite | Подписка только на `RoomMemberEvent` | Добавлена поддержка `InviteMemberEvent` |
| Бот отвечал сам себе (цикл) | Нет фильтра собственных сообщений | События от `self.client.user_id` игнорируются |
| Дублирование приветствия | Неидемпотентный invite flow | Room onboarding сделан идемпотентным |
| Агрессивные timeout/retry | Настройки sync по умолчанию | Настроен `AsyncClientConfig` |
| Telegram-ориентированные команды | Тексты в ядре не учитывали платформу | Platform-aware hints в core |

### 4.4. Тесты Matrix

Собран и проходит набор тестов:
- converter tests
- dispatcher tests
- reactions tests
- store tests
- интеграционные тесты core-сценариев

Покрытые сценарии: разбор команд `!new`, `!skills`, `!yes`, `!no`; invite onboarding; защита от self-loop; создание реальной Matrix room; mapping `room_id → chat_id`.

### 4.5. Ограничение: Matrix E2EE

Шифрование (E2EE) в текущей реализации не поддержано. Причина — внешняя:

- `matrix-nio` требует `python-olm` для E2EE
- сборка `python-olm` не воспроизводится на текущей macOS/ARM среде

Текущий рабочий сценарий: **только незашифрованные комнаты**. E2EE — отдельная инфраструктурная задача.

### 4.6. Документация

- Спецификация: `docs/superpowers/specs/2026-03-31-matrix-adapter-design.md`
- План реализации: `docs/superpowers/plans/2026-03-31-matrix-adapter.md`

---

## 5. Тесты

```
tests/
  core/     — 46 тестов (EventDispatcher, ChatManager, AuthManager, SettingsManager, stores)
  platform/ — 5 тестов (MockPlatformClient)
  adapter/  — 3 теста (forum DB functions) [в процессе]

Итого: 70 passed, 3 errors (ошибки — проблема пути импорта в CI, не логики)
```

---

## 6. Отклонения от исходного плана

| Аспект | Исходный план | Фактическое решение | Причина |
|--------|--------------|-------------------|---------|
| Telegram Forum | Бот создаёт группу сам | Пользователь создаёт, бот подключается | Telegram Bot API не позволяет создавать группы |
| Matrix UX | Space-first | DM-first + room-per-chat | Быстрее работает, проще в отладке |
| Платформенный слой | `platform/` | `sdk/` | Конфликт имён с stdlib Python |
| Matrix E2EE | В области применения | Вынесено как отдельная задача | Инфраструктурный блокер (python-olm) |

Все изменения — корректная инженерная адаптация, не регресс.

---

## 7. Текущий статус по направлениям

| Направление | Статус | Примечание |
|-------------|--------|-----------|
| `core/` | ✅ Готово | Полное покрытие тестами |
| `sdk/` (mock) | ✅ Готово | Замена на реальный SDK — замена одного файла |
| Telegram DM-режим | ✅ Готово | Можно тестировать руками |
| Telegram Forum Topics | ✅ Реализовано | Требует ручного QA |
| Matrix adapter | ✅ Готово | В `main` |
| Matrix E2EE | ⏸ Заблокировано | Инфраструктурный блокер |
| Слияние Telegram ветки | 🔄 В процессе | `feat/telegram-adapter` → `main` |

---

## 8. Риски

| Риск | Уровень | Митигация |
|------|---------|-----------|
| Matrix E2EE | Средний | Работаем с незашифрованными комнатами, E2EE — отдельный тикет |
| Forum sync edge-cases | Низкий | Базовый сценарий работает, edge-cases в backlog |
| Реальный SDK vs мок | Низкий | Контракт зафиксирован, замена изолирована в `sdk/mock.py` |

---

## 9. Следующие шаги

**Ближайшие:**
1. Ручной QA Telegram Forum Topics
2. Слияние `feat/telegram-adapter` → `main`
3. Ручной QA Matrix-бота (issue `#14`)

**Среднесрочные:**
1. Расширить покрытие тестами (adapter-level)
2. Довести Matrix settings workflow
3. Актуализировать `docs/api-contract.md`

**Стратегические:**
1. Подготовить замену `MockPlatformClient` → реальный SDK Lambda
2. Довести обе поверхности до demo-ready состояния
3. Отдельно решить Matrix E2EE (инфраструктура)

---

## 10. Вывод

За текущий этап команда собрала работающий каркас двух поверхностей вокруг единого ядра и собственного платформенного контракта.

**Практический итог:**
- Telegram в стадии реального UX-прототипа — можно демонстрировать
- Matrix имеет рабочий transport-слой и модель комнат
- Архитектура устойчива и готова к замене мока на реальный SDK

Проект движется по инженерной логике: исследование ограничений → адаптация архитектуры → фиксация решений → реализация. Не по формальному чеклисту.
