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