veza/docs/V0_503_RELEASE_SCOPE.md
senke 0376bdcd16 docs(v0.503): plan d'implémentation Stream Server E2E + Chat Hardening + Cleanup
- V0_503_RELEASE_SCOPE.md: scope complet (4 lots SS1/CH1/CL1/QA1)
- PLAN_V0_503_IMPLEMENTATION.md: plan détaillé 5 sprints, 39 tâches
- SCOPE_CONTROL.md: références mises à jour v0.502 → v0.503
- PROJECT_STATE.md: prochaine version v0.503, stack technique corrigée
- FEATURE_STATUS.md: chat Go opérationnel, HLS en intégration v0.503
- .cursorrules: scope autorisé v0.503 (SS1, CH1, CL1, QA1)
2026-02-22 21:01:46 +01:00

224 lines
11 KiB
Markdown

# V0.503 Release Scope — Stream Server E2E + Chat Hardening + Cleanup
**Status** : En préparation
**Phase** : 5 — Streaming & Communication
**Prérequis** : v0.502 (taguée)
**Estimation** : ~5 sprints (25 jours ouvrés)
---
## Objectif
Rendre le streaming HLS fonctionnel de bout en bout (upload → transcode → HLS → player), durcir le chat Go (rate limiter Redis, présence persistante, full-text search), et nettoyer les vestiges du chat server Rust supprimé en v0.502.
---
## État actuel (pré-v0.503)
| Composant | État | Détail |
|-----------|------|--------|
| **Stream Server Rust** | ✅ Compile, ✅ Docker | HLS endpoints existent mais pipeline E2E non connecté |
| **Go Backend HLS** | ⚠️ Partiel | Appelle `/internal/jobs/transcode` mais pas les endpoints HLS |
| **Frontend HLS** | ⚠️ Partiel | `useHLSPlayer` hook existe mais non branché, player utilise URL directe |
| **hls.js** | ✅ Installé | `^1.6.14` dans package.json |
| **Chat Go** | ✅ Opérationnel | Rate limiter in-memory, présence éphémère, recherche ILIKE basique |
| **Chat Rust (veza-chat-server)** | ❌ Obsolète | Retiré de docker-compose mais dossier et refs CI/CD encore présents |
---
## Lots
### Lot SS1 — Stream Server HLS Integration (E2E)
**Objectif** : Un track uploadé est jouable en HLS adaptatif dans le player.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| SS1-01 | Ajouter endpoints Go proxy HLS (`GET /api/v1/tracks/:id/hls/master.m3u8`, `/hls/status`) | `internal/handlers/stream_handler.go` | M |
| SS1-02 | Étendre `stream_service.go` : appeler transcoding HLS (pas juste compress), vérifier statut HLS via stream server | `internal/services/stream_service.go` | M |
| SS1-03 | Ajouter config Go `HLSEnabled` (flag activable), `StreamServerHLSURL` | `internal/config/config.go` | S |
| SS1-04 | Mettre à jour le callback `/api/v1/internal/tracks/:id/stream-ready` pour inclure info HLS | `internal/handlers/stream_handler.go` | S |
| SS1-05 | Frontend : intégrer `useHLSPlayer` dans le player principal | `apps/web/src/features/player/` | M |
| SS1-06 | Frontend : ABR quality selector (utiliser données `useHLSPlayer`) | `apps/web/src/features/player/components/` | M |
| SS1-07 | Mettre à jour Caddy staging/prod pour proxyer `/hls/*` → stream-server | `config/caddy/Caddyfile.staging`, docker-compose files | S |
| SS1-08 | Story Storybook player HLS (Loading, Error, Quality switch) | `apps/web/src/features/player/` | S |
| SS1-09 | MSW handler pour HLS endpoints | `apps/web/src/mocks/handlers-streaming.ts` | S |
| SS1-10 | Test E2E : upload → transcode → HLS playback | `veza-backend-api/internal/integration/` | L |
### Lot CH1 — Chat Server Hardening
**Objectif** : Améliorer la robustesse et les performances du chat Go.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| CH1-01 | Migrer rate limiter vers Redis (sliding window, clé `chat:ratelimit:{user}:{action}`) | `internal/websocket/chat/rate_limiter.go` | M |
| CH1-02 | Présence tracking avec persistence Redis (HASH `chat:presence:{user}`, TTL heartbeat) | `internal/websocket/chat/hub.go`, nouveau `presence_service.go` | M |
| CH1-03 | Migration SQL : ajouter `tsvector` + index GIN sur `messages.content` | Nouvelle migration `113_messages_fts.sql` | S |
| CH1-04 | Remplacer ILIKE par `ts_query` dans `SearchMessages` | `internal/websocket/chat/handler_history.go`, `chat_message_repository.go` | M |
| CH1-05 | Ajouter `GET /api/v1/users/:id/presence` REST endpoint (en plus du WS) | `internal/handlers/presence_handler.go` | S |
| CH1-06 | Tests unitaires rate limiter Redis (mock Redis) | `internal/websocket/chat/rate_limiter_test.go` | S |
| CH1-07 | Tests unitaires presence service | `internal/websocket/chat/presence_service_test.go` | S |
| CH1-08 | Benchmark : 100+ connexions WebSocket simultanées (Go bench) | `internal/websocket/chat/benchmark_test.go` | M |
### Lot CL1 — Cleanup & Archivage Chat Rust
**Objectif** : Supprimer toute trace opérationnelle du chat server Rust.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| CL1-01 | Archiver `veza-chat-server/``archive/veza-chat-server/` (ou supprimer) | Dossier `veza-chat-server/` | S |
| CL1-02 | Supprimer chat-server de CI workflow `ci.yml` (build, audit, lint, test) | `.github/workflows/ci.yml` (lignes ~84-101) | S |
| CL1-03 | Supprimer chat-server de CD workflow `cd.yml` (build, scan, SBOM, sign, deploy) | `.github/workflows/cd.yml` (lignes 41, 60-66, 79, 92, 110, 120, 137) | S |
| CL1-04 | Supprimer scrape `chat-server:8081` de Prometheus config | `config/prometheus.yml` (lignes 18-21) | S |
| CL1-05 | Supprimer proxy `/ws → chat-server:8081` de Caddyfile staging | `config/caddy/Caddyfile.staging` (ligne 3) | S |
| CL1-06 | Retirer `veza-chat-server` des npm workspaces si référencé | `package.json` (root) | S |
| CL1-07 | Nettoyer `go.work` si le chat-server y est référencé | `go.work` | S |
| CL1-08 | Vérifier et nettoyer les références Turborepo (`turbo.json`) | `turbo.json` | S |
### Lot QA1 — Tests & Documentation finale
**Objectif** : Valider l'ensemble, mettre à jour la documentation.
| # | Tâche | Fichiers impactés | Effort |
|---|-------|--------------------|--------|
| QA1-01 | Mettre à jour `FEATURE_STATUS.md` : HLS opérationnel, chat Go complet | `docs/FEATURE_STATUS.md` | S |
| QA1-02 | Mettre à jour `PROJECT_STATE.md` pour v0.503 | `docs/PROJECT_STATE.md` | S |
| QA1-03 | Créer `SMOKE_TEST_V0503.md` — checklist validation | `docs/SMOKE_TEST_V0503.md` | S |
| QA1-04 | Mettre à jour `CHANGELOG.md` | `CHANGELOG.md` | S |
| QA1-05 | Archiver `V0_503_RELEASE_SCOPE.md``docs/archive/` | `docs/archive/` | S |
| QA1-06 | Créer placeholder `V0_601_RELEASE_SCOPE.md` | `docs/V0_601_RELEASE_SCOPE.md` | S |
| QA1-07 | Rétrospective v0.503 | `docs/RETROSPECTIVE_V0503.md` | S |
| QA1-08 | Tag `v0.503` | Git | S |
---
## Fichiers impactés (récapitulatif)
### Backend Go (nouveau/modifié)
| Fichier | Action |
|---------|--------|
| `internal/handlers/stream_handler.go` | Modifier — ajouter endpoints HLS proxy |
| `internal/services/stream_service.go` | Modifier — HLS transcoding + status |
| `internal/config/config.go` | Modifier — flag `HLSEnabled` |
| `internal/websocket/chat/rate_limiter.go` | Modifier — Redis backend |
| `internal/websocket/chat/hub.go` | Modifier — presence persistence |
| `internal/websocket/chat/handler_history.go` | Modifier — FTS ts_query |
| `internal/repositories/chat_message_repository.go` | Modifier — FTS query |
| `internal/websocket/chat/presence_service.go` | Nouveau |
| `internal/handlers/presence_handler.go` | Nouveau ou modifier |
| `migrations/113_messages_fts.sql` | Nouveau |
### Frontend (nouveau/modifié)
| Fichier | Action |
|---------|--------|
| `apps/web/src/features/player/` | Modifier — intégrer useHLSPlayer |
| `apps/web/src/features/player/components/` | Modifier — quality selector |
| `apps/web/src/mocks/handlers-streaming.ts` | Nouveau |
### Infra & CI/CD
| Fichier | Action |
|---------|--------|
| `.github/workflows/ci.yml` | Modifier — retirer chat-server |
| `.github/workflows/cd.yml` | Modifier — retirer chat-server |
| `config/prometheus.yml` | Modifier — retirer chat-server scrape |
| `config/caddy/Caddyfile.staging` | Modifier — retirer /ws, ajouter /hls |
| `docker-compose.yml` | Vérifier — HLS config |
| `docker-compose.staging.yml` | Vérifier — HLS config |
| `docker-compose.prod.yml` | Vérifier — HLS config |
### Archivage / Suppression
| Fichier | Action |
|---------|--------|
| `veza-chat-server/` | Archiver ou supprimer |
---
## Critères d'acceptation
### Lot SS1
- [ ] Un track uploadé déclenche un transcoding HLS (3 tiers : 128k, 256k, 320k)
- [ ] Le player charge automatiquement la playlist HLS quand disponible
- [ ] L'ABR fonctionne (switch qualité automatique selon bande passante)
- [ ] Le quality selector permet de forcer une qualité
- [ ] Le streaming HLS est authentifié (stream token éphémère)
- [ ] La story Storybook du player affiche les 3 états (Loading, Error, Quality)
- [ ] Le test E2E upload → HLS passe
### Lot CH1
- [ ] Le rate limiter utilise Redis (vérifié par test avec 2 goroutines)
- [ ] La présence est persistée dans Redis et récupérable via REST
- [ ] La recherche de messages utilise full-text search PostgreSQL
- [ ] Le benchmark atteint 100+ connexions simultanées sans erreur
### Lot CL1
- [ ] Le dossier `veza-chat-server/` est archivé ou supprimé
- [ ] `git grep chat-server` ne retourne aucun résultat dans CI/CD/config (hors docs historiques)
- [ ] `cargo build` n'est plus exécuté pour le chat-server en CI
### Lot QA1
- [ ] FEATURE_STATUS.md reflète l'état réel du code
- [ ] CHANGELOG.md est à jour
- [ ] Tag `v0.503` créé
---
## Hors scope v0.503
| Élément | Version cible |
|---------|---------------|
| Go Live (streaming vidéo) | v0.703 |
| 2FA SMS / Passkeys | v0.104 |
| Migration React 19 | v0.602 |
| Blue-green deployment | v0.601 |
| IaC (Terraform/Pulumi) | v0.801 |
| OAuth Discord/Spotify implémentation | v0.601 |
| Payout vendeurs (Stripe Connect) | v0.601 |
| Reviews produits | v0.601 |
| Factures PDF | v0.601 |
| Remboursements | v0.601 |
| Hyperswitch mode production | v0.601 |
| Consolidation des migrations (squash) | v0.601 |
| Découpage fichiers > 1000 LOC | v0.601 |
---
## Risques
| Risque | Mitigation |
|--------|-----------|
| Stream server HLS non fonctionnel en pratique | Tester l'upload → transcode manuellement avant d'intégrer le frontend |
| FFmpeg non disponible dans le container stream-server | Vérifier le Dockerfile stream-server (FFmpeg doit être installé) |
| Redis indisponible en dev (rate limiter + presence) | Conserver le fallback in-memory existant |
| Performance search FTS sur gros volume | L'index GIN et `ts_vector` sont conçus pour ça, benchmarker |
---
## Diagramme de flux HLS (cible v0.503)
```
Upload Track → Go Backend → POST /internal/jobs/transcode → Stream Server (Rust)
FFmpeg transcode
├── 128k.m3u8 + segments
├── 256k.m3u8 + segments
└── 320k.m3u8 + segments
Callback → Go Backend
POST /api/v1/internal/tracks/:id/stream-ready
Track.stream_manifest_url = HLS URL
Player ← hls.js ← GET /hls/:track_id/master.m3u8 ← Stream Server (auth JWT)
└── ABR quality switching automatique
```