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>
This commit is contained in:
2026-07-18 00:54:04 +02:00
parent e38dd75f69
commit c83906332d
23 changed files with 346 additions and 8 deletions

View File

@ -7,3 +7,5 @@
- [gametime-visual-identity](gametime-visual-identity.md) — memory note gametime-visual-identity
- [gametime-ux-execution-nav-and-program-simplification](gametime-ux-execution-nav-and-program-simplification.md) — memory note gametime-ux-execution-nav-and-program-simplification
- [gametime-architecture-set-editing](gametime-architecture-set-editing.md) — memory note gametime-architecture-set-editing
- [gametime-ux-score-chrono](gametime-ux-score-chrono.md) — memory note gametime-ux-score-chrono
- [gametime-architecture-score-chrono](gametime-architecture-score-chrono.md) — memory note gametime-architecture-score-chrono

View File

@ -0,0 +1,29 @@
---
name: gametime-architecture-score-chrono
description: memory note gametime-architecture-score-chrono
metadata:
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`.

View File

@ -0,0 +1,42 @@
---
name: gametime-ux-score-chrono
description: memory note gametime-ux-score-chrono
metadata:
type: project
---
# GameTime — Score chronométré (ticket #18, UX 2026-07-18)
Décision structurante : **le score chronométré est un MODE du Score existant** (`manual` vs `stopwatch`), pas une 4e mesure. Le mental model Temps/Répétitions/Score reste inchangé.
## Configuration exercice
Si "Score" activé → sous-choix "Mode de saisie" : "Saisie libre" (comportement actuel, label+unité) ou "Chrono intégré" (label par défaut "Temps réalisé", pas d'unité libre, unité implicite "temps"). Badge résumé : "Score chrono" au lieu de "Score" pour ce mode.
## Configuration programme (personnaliser l'exercice)
Si mesure = Score chrono : champ "Objectif de chrono" optionnel (aide : "Le résultat réel sera mesuré pendant la série."), pas de "cible score" classique.
## Exécution de séance
Bloc dédié "Chrono score" avec affichage mm:ss.d et boutons Démarrer/Arrêter/Reprendre/Réinitialiser. Comportements clés :
- "Terminer la série" avec chrono non démarré → confirmation "Aucun temps chronométré / Tu n'as pas démarré le chrono score." avec actions "Démarrer le chrono" / "Terminer sans chrono".
- "Terminer la série" avec chrono en cours → arrête automatiquement et enregistre (comportement le plus utile en usage réel).
- "Passer" pendant que le chrono tourne → confirmation "Le chrono en cours sera ignoré."
- Pause de séance → le chrono score se met en pause avec la séance (jamais actif pendant une pause), reprise affiche "Reprendre le chrono".
- Action secondaire "Modifier le temps" pour corriger manuellement (champ min/s/dixièmes), disponible aussi dans la bottom sheet "Modifier la série" de la refonte de navigation (#23).
- Persistance robuste si app fermée pendant que le chrono tourne : horodatage de départ + accumulé, pas un simple compteur mémoire (cohérent avec le reste de l'app).
## Cumul avec les autres mesures
- Avec Répétitions : oui, cas d'usage principal (ex: "10 suicides · chrono score").
- Avec Score libre : non — un seul mode de score actif à la fois, pas les deux simultanément.
- Avec Temps (objectif) : possible mais avertissement explicite affiché en configuration si les deux sont actifs ensemble ("Temps sert d'objectif de durée ; Score chrono enregistre le temps réalisé.").
## Cas limites
- Oubli de démarrer + "Terminer sans chrono" → série Terminée si reps/temps renseignés sinon Passée.
- Réinitialiser le chrono après arrêt avec valeur → confirmation ("Le temps mesuré sera supprimé.").
- Libellés utilisateur : jamais "Score (s)", toujours "Score chrono" dans les listes/badges et "Temps réalisé" dans le détail historique.
## Découpage proposé par UX
1. Domain · mode de score (enum ScoreInputMode manual/stopwatch, propagation dans tous les snapshots).
2. Exercices/Programmes · configuration Score chrono (choix du mode, objectif de chrono).
3. Exécution · chrono score intégré (démarrer/arrêter/reprendre/réinitialiser, auto-stop, confirmations).
4. Historique/Plan · affichage Score chrono (résumé, détail, édition ponctuelle avec durée manuelle).
Stockage recommandé par UX (à confirmer par Architect) : champ dédié `actualScoreTimeMs` plutôt que réutiliser `actualScore` en secondes — évite d'ambiguïser une durée avec un score numérique libre, facilite l'affichage mm:ss.d.