surfaces/docs/reports/2026-04-01-final-report.md

280 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Отчёт о проделанной работе — 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
Проект движется по инженерной логике: исследование ограничений → адаптация архитектуры → фиксация решений → реализация. Не по формальному чеклисту.