--- id: "a8c9ec77-2e81-4306-841e-e9a7714afc8f" number: 97 title: "#91-B [DevBackend] Projection compacte d'exécution téléphone -> montre" status: "closed" priority: "medium" sprint: null links: [{"target":"#95","kind":"dependsOn"}] agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"}] createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdAt: 1784991949132 updatedAt: 1784992086886 version: 2 --- Partie #91, dépend de #91-A. Côté téléphone, calculer la `WatchSessionProjection` depuis l'état d'exécution actif (même source de vérité que l'écran d'exécution, pas de deuxième modèle). Mapper : - phase : noActiveSession | ready | running | paused | nextTimerReady | restRunning | restPaused | betweenSetsReady - seriesIndex/seriesTotal, exerciseName, passageIndex/passageTotal?, stepIndex/stepTotal?, stepName? - dominantTimer? + secondaryTimers avec timestamps autoritaires (referenceEpochMs, accumulatedMs, startedAtEpochMs?, targetMs?) pour interpolation locale montre - primaryAction + secondaryActions, nextExerciseName?, statusLabel?, phoneReachable, revision Définition de done : projection produite depuis l'état actif, tests unitaires couvrant chaque phase + transitions clés (chrono running, Chrono suivant prêt, repos, entre séries).