The app no longer dumps Postgres, restores it, or checks copies in CI. Co-authored-by: Cursor <cursoragent@cursor.com>
5.5 KiB
5.5 KiB
План разработки
Каждый этап заканчивается рабочей версией с тегом и релизом.
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 — руководство администратора, аудит доступности WCAG 2.1 AA, k6-smoke
(
tests/load/smoke.js, запускается вручную на сервере перед релизом). Копии базы и музыки — внешними средствами.
Дальше (идеи)
- Плейлисты, волна по исполнителю / треку, ежедневные подборки, тексты песен, Chromecast / DLNA, Android Auto, iOS (TestFlight), Last.fm-скробблинг, импорт лайков.