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>
25 lines
2.3 KiB
Markdown
25 lines
2.3 KiB
Markdown
---
|
|
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. |