ROADMAP — этапы и порядок сборки¶
Порядок пересобран 2026-08-13 после разбора совета и решения о боте как единой точке входа (ADR-0023). Прежний порядок (ADR-0009) ставил инфраструктуру доступа в конец — это оказалось невозможным: без публичного HTTPS не работают ни Mini App, ни подключение Google Health (ADR-0025).
Конкретные задачи — на доске: http://gitlab.local/mybit/platform/-/boards
Офлайн-копия с контекстом — в tasks/ (см. tasks/README.md).
Статус на 2026-08-13.
Этап 0 — Каркас ✅ сделано¶
- [x] Группа GitLab
mybit, 10 репозиториев, CI в каждом (ADR-0012) - [x] Рантайм: VM
pet(7 ГБ), group-раннер там же, сборка без registry (ADR-0018) - [x] Контракты
CoreService+ сгенерированный Go/Python (ADR-0014) - [x] Заготовки всех сервисов: собираются, тесты и линтеры зелёные
- [x] Форк wger импортирован (хард-форк, ADR-0020)
- [x] Разбор совета, посылка проекта переформулирована (ADR-0019)
Этап 1 — Вход 🔜 следующий¶
Цель: пользователь регистрируется через бота и открывает wger в Telegram.
Инфраструктура доступа идёт первой не потому, что она интересная, а потому что без неё не работает ничего из видимого.
- [ ] Туннель
pet→ VPS + Caddy, валидный TLS по домену (ADR-0025) - [ ] wger: оформить хард-форк, удалить nutrition (ADR-0020)
- [ ] wger: поля
set_started_at/set_finished_at+ миграция + REST API - [ ] wger: собрать свой образ, подключить в compose
- [ ] Бот:
/start, регистрация — пользователь в core + связанный аккаунт wger - [ ] Бот: кнопка
web_app, Mini App открывается по HTTPS - [ ] Бот: проверка
initDataна каждом запросе (логика готова, нужно подключить)
Готово, когда с телефона можно зарегистрироваться в боте и открыть wger внутри Telegram.
Этап 2 — Логирование¶
Цель: подход логируется с реальными T1/T2 и сохраняется.
- [ ] Mini App: список упражнений из wger через прокси бота (не хардкодить)
- [ ] Mini App: отправка подхода с клиентскими таймстампами (ADR-0013)
- [ ] Бот: прокси-эндпоинты к wger (сессия, лог подхода)
- [ ] Реальная тренировка в зале с телефона
Готово, когда после тренировки в БД лежат подходы с корректными T1/T2.
Этап 3 — Склад правды¶
Цель: данные нормализованы в core и выгружаются одной командой.
- [ ] core:
user_idв схему + миграции (#33) и починка дефектов контрактов (#30) — одной миграцией, они трогают одни и те же натуральные ключи - [ ] core: провенанс в
health.proto(#29) — заодно, пока proto открыт - [ ] core: подключение к Postgres,
IngestWorkout/IngestSetsс upsert - [ ] wger-sync-worker: обход REST API wger, курсор, идемпотентная запись
- [ ] core:
Exportпотоком (ADR-0016),GetStats - [ ] Бот:
/exportи/stats
Готово, когда /export отдаёт CSV со всеми залогированными подходами.
Этап 4 — Источники и проверка гипотезы¶
Цель: данные организма в core, и получен ответ, несёт ли пульс информацию.
- [ ] Бот: подключение Google-аккаунта — выдать ссылку, принять callback, положить токены пользователя в core (ADR-0024)
- [ ] google-health-sync: обход пользователей, сбор intraday-точек
- [ ] core:
IngestHealth - [ ] core: эпизоды усилия
[T1, T2+60s], фазы раздельно,hr_point_count(#22) - [ ] Отчёт о покрытии и остаточной дисперсии (#32) — здесь гипотеза либо подтверждается, либо закрывается
- [ ] Бот: приём InBody PDF → парсер → core
- [ ] Бот: приём Apple Health
export.xml→ импортёр → core
Готово, когда есть ответ с числами: несёт ли пульс информацию сверх уже залогированного. Отрицательный ответ закрывает одну задачу, а не проект — тайминги подходов ценны сами по себе (ADR-0019).
Этап 5 — Удобство¶
- [ ] Бот: вебхук вместо long polling
- [ ] Бэкапы обеих Postgres с проверкой восстановления, а не только дампа
- [ ] Простой экран просмотра InBody/Fitbit
Осознанно отложено¶
- Брокер сообщений. Не нужен: gRPC + идемпотентный upsert + курсор уже дают at-least-once с дедупликацией (ADR-0022).
- Container Registry. Не нужен, пока рантайм-хост один (ADR-0018).
- TimescaleDB, Grafana, Prometheus. Обычных индексов хватает, а память на
petтратится на стек, а не на наблюдаемость. - Регистрация с ролями и приглашениями. Схема мультипользовательская (ADR-0021), но механика — только через бота, без ролей.
- E2E в основном пайплайне. Playwright тянет браузер на каждый прогон.