---
id: "da78f1df-ff9b-4745-b108-b312eec9efe7"
number: 25
title: "[DevBackend] Domain et migration pour le score chronométré"
status: "closed"
priority: "high"
sprint: null
links: [{"target":"#18","kind":"relatesTo"}]
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: 1784328239814
updatedAt: 1784329799370
version: 2
---
Fondation du ticket #18 (score chronométré). Ajouter ScoreInputMode (manual|stopwatch) sur Exercise avec propagation snapshot pattern (ProgramExercise, snapshot de séance, ActiveSetResult, WorkoutHistorySetResult). Ajouter actualScoreTimeMs/targetScoreTimeMs/targetScoreTimeMsOverride distincts de actualScore/targetScore/targetScoreOverride. Nouvelle table Drift ActiveScoreStopwatchState (status running|stopped, startedAt, accumulatedMs, stoppedAt, clé programIndex/exerciseIndex/setIndex). Migration Drift schemaVersion 2 -> 3. Use cases : démarrer/arrêter/reprendre/réinitialiser le chrono d'une série, copie de la durée finale vers ActiveSetResult à la validation. Cf. mémoires "gametime-ux-score-chrono" et "gametime-architecture-score-chrono" pour le détail complet.