---
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).
