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:
2026-07-18 00:19:10 +02:00
parent abfbb64de2
commit ddc71d2f7b
13 changed files with 204 additions and 1 deletions

View File

@ -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-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-dev-environment](gametime-dev-environment.md) — memory note gametime-dev-environment
- [gametime-visual-identity](gametime-visual-identity.md) — memory note gametime-visual-identity - [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

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

View File

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

View File

@ -0,0 +1,6 @@
---
issueRef: "#20"
version: 2
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784325859788
---

View File

@ -0,0 +1,16 @@
---
id: "8355edb7-bdbd-4f93-820c-d7de0affebef"
number: 20
title: "[DevFrontend] Programme : cartes exercice compactes + écran de personnalisation séparé"
status: "inProgress"
priority: "high"
sprint: null
links: [{"target":"#7","kind":"relatesTo"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784325837553
updatedAt: 1784325859788
version: 2
---
Simplifier la liste d'exercices d'un programme (lib/presentation/program_screen.dart) : chaque ligne n'affiche par défaut que la poignée de déplacement, le nom de l'exercice, le repos affiché, et une icône "personnaliser" (tooltip "Personnaliser l'exercice") ouvrant un écran séparé "Personnaliser l'exercice" avec la configuration complète (séries, mesures, cibles, repos). Ajout d'un exercice = valeurs par défaut immédiates (3 séries, toutes les mesures disponibles actives, repos = défaut du programme) + snackbar "Exercice ajouté" avec action rapide "Personnaliser". Cf. mémoire "gametime-ux-execution-nav-and-program-simplification" point 2 pour le détail complet.

View File

@ -0,0 +1,6 @@
---
issueRef: "#21"
version: 3
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784326729918
---

View File

@ -0,0 +1,16 @@
---
id: "2444e487-58c1-4180-9fac-c5d5df9bdd68"
number: 21
title: "[DevBackend] Modèle et use cases pour l'édition ponctuelle de séries en séance active"
status: "closed"
priority: "high"
sprint: null
links: [{"target":"#9","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: 1784325841003
updatedAt: 1784326729918
version: 3
---
Ajouter le nécessaire pour permettre de consulter et corriger le résultat d'une série déjà terminée/passée sans déplacer le curseur de progression de la séance. Cf. mémoire "gametime-architecture-set-editing" (cadrage Architect) pour le détail exact : champ status (completed|skipped) sur ActiveSetResult + migration Drift, use case upsertSetResultAtPosition, use case listSetResults(sessionId), propagation du statut skipped vers l'historique.

View File

@ -0,0 +1,6 @@
---
issueRef: "#22"
version: 2
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784325851266
---

View File

@ -0,0 +1,16 @@
---
id: "a9ed002f-5e6c-4658-9a1b-ee772ce623ea"
number: 22
title: "[DevFrontend] Exécution : plan de séance consultable"
status: "open"
priority: "high"
sprint: null
links: [{"target":"#9","kind":"relatesTo"},{"target":"#21","kind":"dependsOn"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784325843738
updatedAt: 1784325851266
version: 2
---
Ajouter une action "Voir le plan" sur l'écran d'exécution (lib/presentation/workout_execution_screen.dart) ouvrant une bottom sheet plein écran "Plan de séance" listant tous les programmes/exercices/séries avec leur état (À faire / En cours / Terminée avec résumé / Passée). Dépend du use case listSetResults du ticket backend dédié. Cf. mémoire "gametime-ux-execution-nav-and-program-simplification" point 1.

View File

@ -0,0 +1,6 @@
---
issueRef: "#23"
version: 3
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784325855260
---

View File

@ -0,0 +1,16 @@
---
id: "5b61b1a0-6bed-4d51-912f-cedf27f2b1a2"
number: 23
title: "[DevFrontend] Exécution : édition ponctuelle d'une série passée ou terminée"
status: "open"
priority: "high"
sprint: null
links: [{"target":"#9","kind":"relatesTo"},{"target":"#21","kind":"dependsOn"},{"target":"#22","kind":"dependsOn"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784325846325
updatedAt: 1784325855260
version: 3
---
Depuis le plan de séance, permettre de taper une série Terminée ou Passée pour ouvrir une bottom sheet "Modifier la série" (mêmes champs que l'exécution active) et sauvegarder via upsertSetResultAtPosition, sans déplacer le curseur de progression ni affecter les repos/temps total. Gestion du repos actif pendant l'édition (bandeau compact persistant). Cf. mémoire "gametime-ux-execution-nav-and-program-simplification" point 1 pour le détail complet des cas limites.

View File

@ -1,3 +1,3 @@
{ {
"nextNumber": 20 "nextNumber": 24
} }

View File

@ -214,6 +214,54 @@
"9933c93a-b8a1-4164-a3bb-7063fdad747d" "9933c93a-b8a1-4164-a3bb-7063fdad747d"
], ],
"updatedAt": 1784325166560 "updatedAt": 1784325166560
},
{
"issueRef": "#20",
"path": "20",
"title": "[DevFrontend] Programme : cartes exercice compactes + écran de personnalisation séparé",
"status": "inProgress",
"priority": "high",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784325859788
},
{
"issueRef": "#21",
"path": "21",
"title": "[DevBackend] Modèle et use cases pour l'édition ponctuelle de séries en séance active",
"status": "closed",
"priority": "high",
"sprint": null,
"assignedAgentIds": [
"10ee045b-1c41-479e-ba03-dceed9edd495"
],
"updatedAt": 1784326729918
},
{
"issueRef": "#22",
"path": "22",
"title": "[DevFrontend] Exécution : plan de séance consultable",
"status": "open",
"priority": "high",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784325851266
},
{
"issueRef": "#23",
"path": "23",
"title": "[DevFrontend] Exécution : édition ponctuelle d'une série passée ou terminée",
"status": "open",
"priority": "high",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784325855260
} }
] ]
} }