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

11 KiB

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.mddocs/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