---
name: gametime-architecture-initial-stack-data-model
description: memory note gametime-architecture-initial-stack-data-model
metadata:
  type: project
---
GameTime retient Flutter pour l'app iOS/Android, avec priorité performance UI cross-device, open source et maturité mobile.

Le stockage local retenu est SQLite via Drift. L'app est strictement offline-first. Les médias sont stockés en fichiers locaux et référencés par une table MediaAsset.

Le modèle doit utiliser des IDs stables générés localement (UUIDv7 ou ULID), timestamps, soft delete, localRevision, originDeviceId, syncState et un change_log pour préparer une sync serveur incrémentale future.

Les programmes gardent des snapshots lisibles des exercices. Les séances-modèles sont composées de snapshots indépendants des programmes sources. Elles autorisent uniquement des overrides locaux du nombre de séries et des valeurs cibles numériques des mesures déjà actives. L'historique est un snapshot autonome complet de la séance jouée, avec lien optionnel vers la séance-modèle source.

## Architecture logique (hexagonale)
- domain : entités métier, invariants (ne connaît ni Flutter ni Drift).
- application : use cases, ports de repositories.
- infrastructure/local : adapters SQLite/Drift, fichiers médias.
- presentation : UI Flutter, état écran, navigation.

## Entités principales
Exercise, MediaAsset, Program, ProgramExercise (snapshot d'exercice + mesures activées + cibles + repos), WorkoutTemplate, WorkoutTemplateProgram (snapshot de programme), WorkoutTemplateExerciseOverride (surcharge locale setsCount/cibles uniquement), ActiveWorkoutSession + ActiveSetResult + ActiveRestState (état de séance en cours, reprenable, basé sur horodatages), WorkoutHistory + WorkoutHistorySetResult (snapshot figé et autonome).

## Points de friction actés
- Repos matérialisé comme événements concrets à l'exécution (pas juste une règle statique), pour survivre aux réordonnancements et aux ajustements +/-15s.
- Exercice jamais supprimé dur (archivedAt) ; copies lisibles conservées dans programmes/historique.
- Score stocké en valeur numérique décimale + label/unité snapshotés (le label/unité de l'exercice source peut évoluer sans casser l'historique).
- Pas d'IDs auto-incrémentés : IDs stables générés localement, pensés sync dès le départ.

Détail complet (schémas de champs par entité) disponible dans la réponse Architect du 2026-07-17, à ressolliciter auprès de l'agent Architect si besoin de le retrouver précisément.