docs: add final progress report for 2026-04-01
This commit is contained in:
parent
27f3da86a7
commit
1c6e028e48
1 changed files with 280 additions and 0 deletions
280
docs/reports/2026-04-01-final-report.md
Normal file
280
docs/reports/2026-04-01-final-report.md
Normal file
|
|
@ -0,0 +1,280 @@
|
||||||
|
# Отчёт о проделанной работе — 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
|
||||||
|
|
||||||
|
Проект движется по инженерной логике: исследование ограничений → адаптация архитектуры → фиксация решений → реализация. Не по формальному чеклисту.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue