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