# План разработки Каждый этап заканчивается рабочей версией с тегом и релизом. ## M0 — Скелет (v0.1) - Монорепо: pnpm + Turborepo, Go-модуль, Python-проект, `openapi.yaml` с `server-info`. - `deploy/compose.dev.yaml`, nginx, Postgres, Redis, Meilisearch. - `ci.yml` и `release.yml` (пока собирают пустые образы и debug-APK «hello»), генерация тестовой музыки. - **Готово, когда:** тег `v0.1.0` создаёт релиз в Gitea с образами и APK. ## M1 — Доступ (v0.2) - Bootstrap-админ, вход, refresh-ротация, смена пароля / учётных данных, сессии. - Роли и политика прав, админка «Пользователи», аудит. - Веб: каркас (топбар, сайдбар, пустой плеер), экраны входа и setup, i18n ru / en. - **Готово, когда:** E2E-сценарии 1, 2, 8, 9, 10 зелёные. ## M2 — Библиотека и поиск (v0.3) - storage-agent, источники NFS / local, тест подключения. - Шаблоны путей с предпросмотром, сканер (инкрементальный, переименования, дубли), обложки. - Meilisearch, suggest и страница поиска, страницы исполнителя и альбома. - **Готово, когда:** реальная библиотека 11k треков сканируется, поиск < 50 мс, сценарии 3, 4. ## M3 — Воспроизведение (v0.4) - Стриминг через X-Accel, подписанные ссылки, транскодинг и кэш. - Плеер в вебе (очередь, Media Session, горячие клавиши, нормализация), сохранение состояния. - События, история, лайки / дизлайки, раздел «Коллекция». - **Готово, когда:** сценарии 5, 7; перемотка мгновенная; позиция восстанавливается на другом устройстве. ## M4 — Моя волна v1 (v0.5) - analyzer (Essentia), признаки и эмбеддинги, прогресс в админке. - recommender: кандидаты, эвристическое ранжирование, контексты (занятия / настроения), сессионный вектор, правила разнообразия; fallback в Go. - Анимированная кнопка волны и MoodPicker в вебе. - **Готово, когда:** сценарий 6; метрики волны видны в админке. ## M5 — Android (v0.6) - Вход с адресом сервера, главная с волной, поиск, коллекция, плеер с фоновым воспроизведением. - Офлайн: загрузки, «Скачанное», очередь событий. - Самообновление через сервер. - **Готово, когда:** Maestro-сценарии зелёные; обновление 0.6.0 → 0.6.1 проходит на реальном устройстве. ## M5.5 — Очередь на добавление (v0.7) - Отпечатки (SHA-256, Chromaprint) для существующей библиотеки. - Запись через storage-agent, `accepts_uploads`, `write_template` с автоподбором и проверкой обратимости. - tus-загрузка, предпроверка дублей, квота, обработка, экраны «Предложить треки», «Очередь на добавление», «Настройки». - **Готово, когда:** E2E-сценарии 11, 12; импорт реального альбома ложится рядом с существующими по той же структуре. ## M6 — Моя волна v2 (v0.8) - ALS, центроиды вкусов, LightGBM-ранжировщик, бандит, онбординг, ночное обучение с проверкой метрик. - Персонализация suggest. - **Готово, когда:** на накопленных данных v2 лучше v1 по офлайн-NDCG и онлайн early-skip rate. - **Состояние:** всё реализовано (v0.8, v1.0). Ранжировщик включается сам после ~20 тыс. размеченных показов; критерий проверяется по метрикам версий в админке («Библиотека → Моя волна») и NDCG в `model_versions`. ## M7 — Стабилизация (v1.0) - Нагрузочный smoke, бэкапы и восстановление (проверено), документация администратора, доступность, полировка анимаций, багфиксы. - **Состояние:** v1.0 — бэкапы с еженедельной проверкой восстановления (и цикл копия → проверка → восстановление в CI), [руководство администратора](admin-guide.md), аудит доступности WCAG 2.1 AA, k6-smoke (`tests/load/smoke.js`, запускается вручную на сервере перед релизом). ## Дальше (идеи) - Плейлисты, волна по исполнителю / треку, ежедневные подборки, тексты песен, Chromecast / DLNA, Android Auto, iOS (TestFlight), Last.fm-скробблинг, импорт лайков.