docs(ideai): met à jour la mémoire et les tickets #20-#23
Ajoute les notes mémoire sur l'architecture d'édition des séries et la simplification navigation/programme, et reflète le ticket #21 (terminé) ainsi que le cadrage des tickets #20, #22, #23. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -5,3 +5,5 @@
|
||||
- [gametime-architecture-initial-stack-data-model](gametime-architecture-initial-stack-data-model.md) — memory note gametime-architecture-initial-stack-data-model
|
||||
- [gametime-dev-environment](gametime-dev-environment.md) — memory note gametime-dev-environment
|
||||
- [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
|
||||
|
||||
25
.ideai/memory/gametime-architecture-set-editing.md
Normal file
25
.ideai/memory/gametime-architecture-set-editing.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
name: gametime-architecture-set-editing
|
||||
description: memory note gametime-architecture-set-editing
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
# GameTime — Cadrage Architect : édition ponctuelle de séries (2026-07-18)
|
||||
|
||||
Réponse d'Architect au besoin UX de navigation libre dans une séance active (mémoire "gametime-ux-execution-nav-and-program-simplification").
|
||||
|
||||
## Ce qui existe déjà et est réutilisable
|
||||
- `ActiveSetResults` (Drift) a déjà `programIndex`, `exerciseIndex`, `setIndex` avec contrainte `UNIQUE (active_workout_session_id, program_index, exercise_index, set_index)` — l'identification positionnelle d'une série est stable, un upsert par position est possible sans ambiguïté.
|
||||
- `recordCurrentSetResult` n'avance pas le curseur de progression lui-même (c'est `updateProgress`, séparé) mais reste sémantiquement dédié à la série courante (recrée un résultat avec nouvel ID/métadonnées) — pas réutilisable tel quel pour l'édition ponctuelle.
|
||||
|
||||
## Ce qui doit être ajouté
|
||||
- Champ `status` sur `ActiveSetResult` (enum `completed | skipped`), avec invariant : `skipped` implique aucune valeur `actual*` renseignée. Migration Drift nécessaire (schemaVersion+1).
|
||||
- Nouveau use case `upsertSetResultAtPosition(...)` : vérifie que la position appartient au snapshot de la séance, conserve l'id/createdAt si une ligne existe déjà à cette position, écrit `completed` ou `skipped`, et **ne touche jamais** `currentProgramIndex/currentExerciseIndex/currentSetIndex`.
|
||||
- Nouveau use case `listSetResults(sessionId)` pour construire l'état du plan de séance (à faire / en cours / terminée / passée par position).
|
||||
|
||||
## Invariants à respecter côté DevBackend
|
||||
- L'édition ponctuelle ne crée, ne relance et ne termine jamais de repos (`ActiveRestState` reste un événement indépendant attaché à la série précédente).
|
||||
- Le temps total de séance reste calculé depuis les horodatages de session, jamais recalculé depuis la liste des résultats.
|
||||
- Pas d'édition de série future en v1 (seulement passé/courant).
|
||||
- Si la position éditée correspond à la position courante, rediriger vers le flux d'exécution normal plutôt que permettre une double édition simultanée.
|
||||
- Propager le statut `skipped` jusqu'à l'historique (WorkoutHistorySetResult) pour que le snapshot final reste lisible et cohérent avec ce qui a été vécu pendant la séance.
|
||||
@ -0,0 +1,40 @@
|
||||
---
|
||||
name: gametime-ux-execution-nav-and-program-simplification
|
||||
description: memory note gametime-ux-execution-nav-and-program-simplification
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
# GameTime — Refonte navigation d'exécution + simplification liste programme (UX, 2026-07-18)
|
||||
|
||||
Suite à un retour utilisateur après premier test réel de la v1.
|
||||
|
||||
## Point 1 — Navigation libre dans une séance en cours
|
||||
|
||||
Distinction centrale : **position courante** (où en est réellement la séance) vs **édition ponctuelle** (ouvrir une série passée/passée pour la corriger, sans déplacer le curseur ni relancer un repos/recalcul).
|
||||
|
||||
- Nouvelle action "Voir le plan" sur l'écran d'exécution → bottom sheet plein écran "Plan de séance" listant tous les programmes/exercices/séries de la séance avec leur état : À faire / En cours / Terminée (résumé valeurs) / Passée (Aucun résultat).
|
||||
- Règle d'accessibilité : Terminée et Passée sont tapables → ouvrent une bottom sheet "Modifier la série" (mêmes champs que l'exécution active, boutons Enregistrer / Marquer comme passée / Annuler). En cours → ferme le plan et revient à l'écran actif. À faire → non tapable en v1 (pas de saut vers le futur, seulement correction du passé).
|
||||
- Édition d'une série ne déplace jamais `currentProgramIndex/currentExerciseIndex/currentSetIndex`, ne relance pas de repos, ne recalcule pas le temps total (basé sur la séance, pas la somme des séries).
|
||||
- Repos actif pendant une édition : continue en arrière-plan, bandeau compact "Repos en cours · 00:32" affiché en haut du plan/de l'édition ; s'il arrive à zéro pendant l'édition, bandeau devient "Repos terminé · Reprendre" sans fermer brutalement la vue.
|
||||
- Cas limites : modifier la série courante via le plan → ferme la sheet et revient à l'écran principal (pas de double édition) ; vider une série terminée → confirmation "Supprimer le résultat de cette série ? / Marquer comme passée" ; logique d'édition n'existe que pour la séance active, pas pour l'historique (autre écran).
|
||||
|
||||
Impacts backend identifiés par UX (à faire trancher par Architect avant implémentation) :
|
||||
- `listSetResults(sessionId)` pour construire l'état du plan.
|
||||
- `upsertSetResultAtPosition(...)` distinct de `recordCurrentSetResult(...)` — écrire un résultat à une position arbitraire sans avancer le curseur.
|
||||
- Distinguer explicitement un résultat "skipped" d'un résultat absent (probablement déjà couvert par le modèle ActiveSetResult existant, à vérifier).
|
||||
- Ne jamais appeler la logique d'avancement de progression lors d'une édition ponctuelle.
|
||||
|
||||
## Point 2 — Liste d'exercices de programme simplifiée
|
||||
|
||||
- Par défaut, chaque ligne d'exercice dans un programme n'affiche QUE : poignée de déplacement, nom de l'exercice, repos affiché (ex: "Repos 45 s"), badge "Exercice archivé" si pertinent, et une icône "personnaliser" (tune/edit_note) avec tooltip "Personnaliser l'exercice".
|
||||
- Plus de checkboxes/mesures/cibles/nombre de séries visibles par défaut dans la liste.
|
||||
- L'icône "personnaliser" ouvre un **écran séparé** "Personnaliser l'exercice" (pas une bottom sheet, pas de déplié inline — clavier numérique + plusieurs sections méritent l'espace d'un écran plein) avec : nombre de séries, mesures à suivre (toggles, au moins une active obligatoire), objectifs par mesure activée, repos après chaque série, actions Enregistrer / Supprimer du programme.
|
||||
- Ajout d'un exercice au programme : ajouté immédiatement avec des valeurs par défaut (3 séries, toutes les mesures disponibles de l'exercice actives, repos = défaut du programme), retour à la liste, snackbar "Exercice ajouté" avec action rapide "Personnaliser".
|
||||
- Validation : au moins une mesure active (message inline si tout décoché), repos positif obligatoire, confirmation avant suppression d'un exercice du programme.
|
||||
|
||||
## Découpage proposé par UX (à transformer en tickets)
|
||||
1. Programme · cartes exercice compactes + écran de personnalisation séparé.
|
||||
2. Exécution · plan de séance consultable (lecture seule des états, sans édition).
|
||||
3. Exécution · correction des séries passées/terminées (édition ponctuelle, gestion repos actif pendant édition).
|
||||
|
||||
Point à trancher avec Architect avant d'attaquer les tickets 2 et 3 : le modèle d'écriture d'un résultat de série à une position arbitraire sans avancer le curseur de progression — vérifier que ça ne casse pas les invariants déjà posés (ActiveSetResult, ActiveWorkoutSession, horodatages) définis dans la mémoire "gametime-architecture-initial-stack-data-model" et les tickets #4/#9/#13/#14.
|
||||
Reference in New Issue
Block a user