## Why La couche temps-réel actuelle (SSE + polling DB à 1s) multiplie les connexions et les requêtes dès que plusieurs utilisateurs collaborent. Chaque onglet ouvert sur une session déclenche son propre polling, et les Server Actions invalident des segments de route entiers avec `revalidatePath`. Ces problèmes de scalabilité deviennent visibles dès 5-10 utilisateurs simultanés. ## What Changes - **Polling SSE partagé** : un seul interval actif par session côté serveur, partagé entre tous les clients connectés à cette session - **Broadcast unifié** : généraliser le pattern de broadcast in-process (déjà présent dans `weather`) à tous les workshops via un module `src/lib/broadcast.ts` - **`revalidateTag` granulaire** : remplacer `revalidatePath` dans tous les Server Actions par des tags ciblés (`session:`, `sessions-list`, etc.) - **Pagination sessions page** : limiter le chargement initial à N sessions par type avec pagination ou chargement progressif ## Capabilities ### New Capabilities - `sse-shared-polling`: Polling SSE mutualisé par session (un seul interval par session active) - `unified-broadcast`: Module de broadcast in-process réutilisable par tous les workshops ### Modified Capabilities - `sessions-list`: Ajout de pagination/limite sur le chargement des sessions ## Impact - `src/app/api/*/subscribe/route.ts` — refactoring du polling vers le module broadcast partagé - `src/lib/broadcast.ts` — nouveau module (Map de sessions actives + subscribers) - `src/actions/*.ts` — remplacement de `revalidatePath` par `revalidateTag` + `unstable_cache` - `src/app/sessions/page.tsx` — ajout pagination - `src/services/` — ajout de `cache` tags sur les requêtes Prisma fréquentes