Перейти к содержанию

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 тянет браузер на каждый прогон.