Files
GameTime/.ideai/memory/gametime-architecture-score-chrono.md
Blomios c83906332d docs(ideai): met à jour la mémoire et les tickets après la préparation sync
Ajoute les notes mémoire sur l'architecture et l'UX du score
chronométré, clôture le ticket #12, ajoute le cadrage des tickets
#24 à #31.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 00:54:04 +02:00

2.4 KiB

name, description, metadata
name description metadata
gametime-architecture-score-chrono memory note gametime-architecture-score-chrono
type
project

GameTime — Cadrage Architect : score chronométré (ticket #18, 2026-07-18)

Stockage validé

  • actualScoreTimeMs (nullable) sur ActiveSetResult et WorkoutHistorySetResult, distinct de actualScore.
  • targetScoreTimeMs sur ProgramExercise, targetScoreTimeMsOverride sur WorkoutTemplateExerciseOverride, distincts de targetScore/targetScoreOverride.
  • Invariant : manual utilise actualScore/targetScore ; stopwatch utilise actualScoreTimeMs/targetScoreTimeMs ; jamais les deux familles remplies simultanément. skipped implique aucune valeur actual* (y compris actualScoreTimeMs).

État transitoire du chrono

Nouvelle table Drift ActiveScoreStopwatchState, sur le même principe que ActiveRestState (horodatages persistés, pas de compteur mémoire) :

  • clé logique : activeWorkoutSessionId + programIndex + exerciseIndex + setIndex
  • status : running | stopped
  • startedAt, accumulatedMs, stoppedAt?
  • Absence de ligne = chrono non démarré.
  • À la validation de la série, copier la durée finale vers ActiveSetResult.actualScoreTimeMs.
  • Pause de séance : si running, figer accumulatedMs ; reprise explicite après resume (pas de décompte pendant la pause).
  • Terminer la série avec chrono running → auto-stop puis enregistrement (comportement UX demandé).

Propagation du mode (snapshot pattern existant, réutilisé tel quel)

ScoreInputMode (manual|stopwatch) : source de vérité sur Exercise, copié dans ProgramExercise, puis dans le snapshot de séance (WorkoutTemplateProgram/exercice snapshotté), puis dans ActiveSetResult et WorkoutHistorySetResult pour affichage autonome sans dépendre de la source. Important : WorkoutTemplateExerciseOverride ne porte JAMAIS le mode lui-même (cohérent avec la règle produit déjà en place : l'override en séance-modèle ne change que des valeurs numériques, jamais la structure/le mode) — seulement targetScoreTimeMsOverride en plus des overrides numériques existants.

Migration Drift

Le schéma est actuellement en schemaVersion = 2 (ticket #21). Le ticket #18 doit passer en 3 : ajout des colonnes mode/chrono sur les tables concernées + création de la table ActiveScoreStopwatchState, migration from < 3.