veza/docs/archive/V0_501_RELEASE_SCOPE.md
senke c416f51f25 docs(v0.501): Sprint 6 -- finalization and tag
- FIN-01: Add smoke test results (22/22 features pass)
- FIN-02: Update PROJECT_STATE.md for v0.501
- FIN-03: Update CHANGELOG.md with v0.501 entries
- FIN-04: Archive V0_501 scope, create V0_502 placeholder
- FIN-05: Add v0.501 retrospective
- FIN-06: Validate Go build passes
2026-02-22 18:45:07 +01:00

249 lines
13 KiB
Markdown

> **ARCHIVED — Completed 2026-02-22**
# V0_501_RELEASE_SCOPE.md — Phase 5 : Streaming & Cloud
**Phase** : 5 — Streaming & Cloud (redéfinie, ex-Education/Gear)
**Version précédente** : v0.404 (Stabilisation post-audit)
**Version suivante** : v0.502
**Prérequis** : v0.404 taguée (sécurité critique résolue, stream server intégré, CI/CD fonctionnel)
---
## 1. Contexte & Redéfinition de la Phase 5
### Pourquoi redéfinir ?
La Phase 5 était initialement « Education / Gear ». Le module Education a été **supprimé** (voir FEATURE_STATUS.md : dossier supprimé, 0/30 features). La Phase 5 doit être redéfinie autour des axes stratégiques restants.
### Choix stratégique
Veza est une **plateforme audio**. Le streaming (HLS, live) est le différenciateur produit. Après la stabilisation v0.404 (qui intègre le stream server et active HLS), la Phase 5 doit consolider cette fondation et ajouter les fonctionnalités cloud qui font de Veza un outil de travail pour les musiciens, pas seulement une vitrine.
### Nouvelle définition Phase 5
> **Phase 5 — Streaming & Cloud** : Rendre le streaming audio production-ready, ajouter le stockage cloud pour les musiciens, et compléter le module Gear.
### Plan Phase 5 complet
| Version | Focus | Lots |
|---------|-------|------|
| **v0.501** | HLS production + Cloud storage MVP + Gear avancé | S1, C1, G1 |
| **v0.502** | Live streaming (Go Live) + Traitement audio | S2, A1 |
| **v0.503** | Cloud avancé + Collaboration fichiers | C2, C3 |
---
## 2. Périmètre v0.501
### Lot S1 — HLS Streaming production-ready
**Prérequis** : v0.404 INT-02 terminé (stream server intégré, gRPC connecté, 1 flux E2E validé).
Le Lot S1 prend le relais pour rendre le streaming fiable et performant en production.
| ID | Feature | Frontend | Backend | Effort |
|----|---------|----------|---------|--------|
| S1.1 | **Transcoding adaptatif** — générer automatiquement 3 variantes HLS (128k, 256k, 320k) à l'upload. Manifest master.m3u8 avec les 3 qualités. | Sélecteur qualité dans le player | Stream server : FFmpeg pipeline multi-bitrate, stockage segments | L |
| S1.2 | **Playback adaptatif (ABR)** — le player sélectionne automatiquement la qualité selon la bande passante. Fallback progressif si un segment échoue. | hls.js intégré au player avec ABR activé | Endpoint `/hls/:track_id/master.m3u8` avec variantes | M |
| S1.3 | **Cache CDN segments HLS** — configurer des headers de cache sur les segments (.ts). Redis cache pour les manifests. TTL configurable. | — | Stream server : headers `Cache-Control`, Redis cache manifest | M |
| S1.4 | **Monitoring streaming** — métriques Prometheus : latence transcodage, erreurs segments, connexions actives, bande passante servie. Dashboard Grafana dédié. | — | Stream server : `/metrics` endpoint, compteurs Prometheus | M |
| S1.5 | **Waveform generation** — générer un fichier waveform JSON à l'upload (FFmpeg audiowaveform). Affichage dans le player et dans TrackDetailPage. | Composant WaveformDisplay, intégration player progress bar | Backend : job async waveform generation, endpoint GET `/tracks/:id/waveform` | L |
### Lot C1 — Cloud Storage MVP
> Permettre aux musiciens de stocker et organiser leurs fichiers audio dans un espace cloud personnel.
| ID | Feature | Frontend | Backend | Effort |
|----|---------|----------|---------|--------|
| C1.1 | **Migration stockage** — table `user_files` (id, user_id, filename, path, size_bytes, mime_type, folder_id, created_at). Table `user_folders` (id, user_id, name, parent_id). | — | Migration, modèles UserFile + UserFolder | S |
| C1.2 | **Upload fichiers cloud**`POST /cloud/files` (multipart), validation type (audio/*, zip, midi, project files). Limite 500MB/fichier, quota 5GB/user (configurable). | Dropzone upload dans CloudPage | Handler, service, stockage S3-compatible (MinIO en dev) | L |
| C1.3 | **File browser** — arborescence de dossiers, navigation, renommage, déplacement, suppression. Tri par nom, date, taille. | CloudBrowserView : tree sidebar + file list + breadcrumbs | CRUD endpoints : `GET/POST/PUT/DELETE /cloud/folders`, `GET /cloud/files` (avec filtres folder_id, sort) | L |
| C1.4 | **Prévisualisation audio** — lecture inline des fichiers audio depuis le cloud sans les ajouter à la bibliothèque publique. Player minimal intégré au file browser. | Mini player inline dans CloudBrowserView | `GET /cloud/files/:id/stream` (auth, range requests) | M |
| C1.5 | **Publier depuis le cloud** — bouton « Publier comme track » qui crée un track à partir d'un fichier cloud, sans re-upload. Lien symbolique vers le fichier existant. | Bouton dans CloudBrowserView → modale CreateTrack pré-remplie | `POST /cloud/files/:id/publish` → crée un track lié au fichier | M |
### Lot G1 — Gear avancé
> Le module Gear (inventaire équipement) est partiellement implémenté (CRUD basique). Le compléter.
| ID | Feature | Frontend | Backend | Effort |
|----|---------|----------|---------|--------|
| G1.1 | **Catégorisation** — catégories prédéfinies (instruments, microphones, interfaces, DAW, plugins, accessoires). Filtrage par catégorie. | Select catégorie dans GearForm, filtres dans GearListView | Champ `category` dans gear, migration, enum validation | S |
| G1.2 | **Images équipement** — upload photo par item (max 3). Affichage galerie dans le détail. | Upload image dans GearForm, galerie dans GearDetailView | `POST /inventory/gear/:id/images`, stockage, migration `gear_images` | M |
| G1.3 | **Gear sur profil public** — section « Mon setup » sur le profil public, affichant les items marqués comme publics. | Section GearShowcase dans ProfilePage | `GET /users/:username/gear` (items publics), champ `is_public` sur gear | M |
| G1.4 | **Recherche Gear** — recherche textuelle dans le nom et la description des items. | SearchBar dans GearListView | Intégration au SearchService existant (type `gear`) | S |
---
## 3. Périmètre HORS SCOPE v0.501
| Élément | Raison | Version cible |
|---------|--------|---------------|
| Live streaming (Go Live, RTMP) | Nécessite infrastructure RTMP, complexité élevée | v0.502 Lot S2 |
| Collaboration fichiers cloud (partage, commentaires) | Dépend de C1 stabilisé | v0.503 Lot C2 |
| Versioning fichiers cloud | Feature avancée | v0.503 Lot C3 |
| Traitement audio (normalisation, trim, fade) | Dépend du stream server stabilisé | v0.502 Lot A1 |
| Gamification | TIER 2, hors priorité MVP | v0.801+ |
| Web3 / tokens | TIER 2, hors priorité MVP | v0.901+ |
| Migration React 19 | Évaluation en v0.501, migration en v0.602 | v0.602 |
---
## 4. Prérequis techniques
| Prérequis | Source | Statut attendu à l'entrée v0.501 |
|-----------|--------|-----------------------------------|
| Stream server intégré (gRPC fonctionnel) | v0.404 INT-02 | ✅ Fait |
| HLS activé (`HLS_STREAMING=true`) | v0.404 INT-02 | ✅ Fait |
| Pipeline CD fonctionnel | v0.404 SEC-01 | ✅ Fait |
| Auth stream token endpoint | v0.404 SEC-03 | ✅ Fait |
| Staging compose complet | v0.404 INF-07 | ✅ Fait |
| Object storage (MinIO/S3) | **Nouveau** — configurer en v0.501 | À faire |
**Note** : Le Lot C1 introduit MinIO (S3-compatible) pour le stockage de fichiers. C'est la **seule nouvelle dépendance infra** de v0.501. En production, remplaçable par AWS S3, GCS, ou Cloudflare R2.
---
## 5. Migrations prévues
| # | Table | Description |
|---|-------|-------------|
| 101 | `user_folders` | Dossiers cloud utilisateur (id, user_id, name, parent_id, created_at) |
| 102 | `user_files` | Fichiers cloud (id, user_id, folder_id, filename, path, size_bytes, mime_type, created_at) |
| 103 | `tracks` (alter) | Ajouter `waveform_url` (nullable, chemin vers waveform JSON) |
| 104 | `gear` (alter) | Ajouter `category` (enum), `is_public` (bool default false) |
| 105 | `gear_images` | Images équipement (id, gear_id, image_url, position, created_at) |
| 106 | `user_storage_quotas` | Quotas stockage (user_id, max_bytes, used_bytes) |
---
## 6. Nouvelles routes API
### Streaming (Lot S1)
| Méthode | Route | Auth | Description |
|---------|-------|------|-------------|
| GET | `/hls/:track_id/master.m3u8` | Stream token | Manifest HLS multi-bitrate |
| GET | `/tracks/:id/waveform` | Optionnel | Waveform JSON |
### Cloud (Lot C1)
| Méthode | Route | Auth | Description |
|---------|-------|------|-------------|
| GET | `/cloud/files` | Requis | Lister fichiers (filtres: folder_id, sort, page) |
| POST | `/cloud/files` | Requis | Upload fichier (multipart) |
| GET | `/cloud/files/:id` | Requis (owner) | Détail fichier |
| DELETE | `/cloud/files/:id` | Requis (owner) | Supprimer fichier |
| GET | `/cloud/files/:id/stream` | Requis (owner) | Stream audio (range requests) |
| POST | `/cloud/files/:id/publish` | Requis (owner) | Publier comme track |
| GET | `/cloud/folders` | Requis | Lister dossiers |
| POST | `/cloud/folders` | Requis | Créer dossier |
| PUT | `/cloud/folders/:id` | Requis (owner) | Renommer/déplacer dossier |
| DELETE | `/cloud/folders/:id` | Requis (owner) | Supprimer dossier (+ contenu) |
| GET | `/cloud/quota` | Requis | Quota utilisateur |
### Gear (Lot G1)
| Méthode | Route | Auth | Description |
|---------|-------|------|-------------|
| POST | `/inventory/gear/:id/images` | Requis (owner) | Upload image équipement |
| DELETE | `/inventory/gear/:id/images/:img_id` | Requis (owner) | Supprimer image |
| GET | `/users/:username/gear` | Optionnel | Gear public d'un utilisateur |
---
## 7. Nouvelles pages/composants frontend
| Page/Composant | Route | Lot |
|----------------|-------|-----|
| CloudPage | `/cloud` | C1 |
| CloudBrowserView | — (dans CloudPage) | C1 |
| CloudUploadModal | — | C1 |
| CloudFolderTree | — | C1 |
| CloudFilePreview (mini player) | — | C1 |
| WaveformDisplay | — (dans player + TrackDetailPage) | S1 |
| QualitySelector | — (dans player) | S1 |
| GearCategoryFilter | — (dans GearListView) | G1 |
| GearImageGallery | — (dans GearDetailView) | G1 |
| GearShowcase | — (dans ProfilePage) | G1 |
---
## 8. Estimation d'effort
| Lot | Features | Effort total estimé | Répartition |
|-----|----------|--------------------| ------------|
| S1 — HLS production | 5 | ~3 semaines | 60% backend/stream server, 40% frontend |
| C1 — Cloud MVP | 5 | ~3 semaines | 50% backend, 30% frontend, 20% infra (MinIO) |
| G1 — Gear avancé | 4 | ~1 semaine | 50/50 |
**Durée totale estimée v0.501** : ~7 semaines (parallélisable à ~5 semaines si S1 et C1 avancent en parallèle)
---
## 9. Critères de succès v0.501
| Critère | Seuil |
|---------|-------|
| Un track uploadé est jouable en HLS multi-bitrate | 3 qualités sélectionnables |
| ABR fonctionne (bascule automatique de qualité) | Vérifié sur connexion throttlée |
| Waveform visible dans le player | Sur 100% des nouveaux tracks |
| Cloud : upload + navigation + preview + publish fonctionnels | Flux E2E validé |
| Quota stockage respecté | Upload refusé au-delà du quota |
| Gear : catégories, images, profil public | Visible sur `/u/:username` |
| Aucune régression sur les 14 features E2E de v0.404 | Smoke test staging |
| Score maturité produit estimé | ≥ 5/10 (vs 3/10 post-audit) |
---
## 10. Risques v0.501
| Risque | Probabilité | Impact | Mitigation |
|--------|-------------|--------|-----------|
| FFmpeg transcoding lent sur gros fichiers | Élevée | UX dégradée (upload → playback long) | Job async + notification quand prêt. Progress bar. Limiter à 200MB initialement. |
| MinIO setup complexe en prod | Moyenne | Retard infra | Commencer avec stockage local en dev, MinIO en staging, S3 en prod. Abstraction storage interface. |
| Quota stockage contournable | Faible | Coûts imprévus | Vérification atomique (transaction DB) avant tout upload. Rate limiting sur upload. |
| Cloud browser UX complexe | Moyenne | Feature sous-utilisée | MVP minimaliste (flat list + 1 niveau dossiers). Tree view en v0.503. |
---
## 11. Impact sur les métriques globales
| Métrique | Avant v0.501 | Après v0.501 (estimé) |
|----------|-------------|----------------------|
| Features E2E fonctionnelles | 14 | ~22 (+8) |
| TIER 0 complétude | 44% (83/190) | ~49% (93/190) |
| Score maturité produit | 3/10 | ~5/10 |
| Module 4 (Streaming) | 36% | ~55% |
| Module 9 (Cloud) | 0% | ~30% |
| Module 11 (Gear) | ~40% | ~60% |
---
## 12. Référence
| Document | Rôle |
|----------|------|
| [V0_404_RELEASE_SCOPE.md](archive/V0_404_RELEASE_SCOPE.md) | Version précédente (stabilisation, archivée) |
| [AUDIT_TECHNIQUE_2026-02-22.md](../AUDIT_TECHNIQUE_2026-02-22.md) | Audit de référence |
| [PLAN_ACTION_AUDIT.md](PLAN_ACTION_AUDIT.md) | Plan d'action détaillé |
| [SCOPE_CONTROL.md](SCOPE_CONTROL.md) | Processus anti-scope-creep |
| [FEATURE_STATUS.md](FEATURE_STATUS.md) | Statut features |
---
## 13. Roadmap Phase 5 complète (preview)
```
v0.501 (ce document)
├── S1 — HLS production (transcoding, ABR, cache, monitoring, waveform)
├── C1 — Cloud MVP (upload, browser, preview, publish)
└── G1 — Gear avancé (catégories, images, profil public)
v0.502
├── S2 — Live streaming (Go Live RTMP → HLS, chat live, modération)
└── A1 — Traitement audio (normalisation, trim, fade-in/out, bounce)
v0.503
├── C2 — Cloud partage (partager fichier/dossier, permissions, lien public)
└── C3 — Cloud avancé (versioning fichiers, historique, restore, corbeille)
```