chore(tickets): clôture des tickets #80 et #81

Met à jour les métadonnées IdeA (statut closed, carnets de suivi) suite à
la livraison et au merge sur develop du code des tickets #80 (bibliothèque
de drills basket de démarrage) et #81 (dernière performance / meilleur
score à l'exécution).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 08:12:03 +02:00
parent 0813327bef
commit fdb301f746
5 changed files with 39 additions and 39 deletions

View File

@ -1,28 +1,23 @@
--- ---
issueRef: "#80" issueRef: "#80"
version: 4 version: 7
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784665470112 updatedAt: 1784698823269
--- ---
## Spec UX (livrée) ## Lot backend (B1+B2+B3) — TERMINÉ, commité (24e266c), mergé sur develop
Bibliothèque d'exercices basket de démarrage (7 catégories, ~20 exercices), programme "Fondations basket - 45 min" (8 exercices), séance-modèle "Séance exemple - Fondations basket", règles UX (badge Exemple, éditable/supprimable, anti-réapparition, états vides). Détail complet dans l'historique de la conversation d'orchestration Main. ## Lot frontend (F1+F2+F3) — DevFrontend — TERMINÉ
## Plan technique Architect (livré) Fichiers : lib/presentation/example_badge.dart (nouveau, badge "Exemple"), exercise_library_screen.dart (catégorie visible, badge, état vide), program_screen.dart (badge, état vide), workout_template_screen.dart (badge, état vide), lib/application/use_cases.dart (préservation isExample à l'édition), tests associés mis à jour.
Migration Drift v16 : ajout `category` (enum ExerciseCategory: shoot, freeThrows, dribble, finishing, conditioning, defense, mobility, uncategorized) + `is_example` sur exercises/programs/workout_templates. Table `local_seed_metadata` (key, version, applied_at) pour tracker `starterSeedVersion=1`. Use case `SeedStarterContentUseCase` appelé dans `AppBootstrap.create()`, transactionnel, "base vide" = aucune ligne (y compris soft-deleted) dans exercises/programs/workout_templates. IDs stables déterministes type `starter-v1-exercise-form-shooting`. Données seed en Dart const (`lib/application/starter_content/basket_starter_seed_v1.dart`), pas JSON. Séance-modèle via `WorkoutTemplateProgram.snapshotFromProgram`. Contenu seed = `syncState=localOnly`, pas de sync serveur automatique. Écart assumé (validé par le brief) : pas d'action "Restaurer les exemples" ni de message de bienvenue ponctuel — hors périmètre minimal du ticket.
Découpage : ## Vérification finale (Main, environnement fonctionnel — sandbox QA/Dev limité en réseau/cache)
- Lot B1 (DevBackend) : schéma/domaine — ExerciseCategory, champs category/isExample, migration v16, mappers, tests migration.
- Lot B2 (DevBackend) : seed applicatif — ports StarterSeedStateRepository/StarterContentRepository, SeedStarterContentUseCase, basket_starter_seed_v1.dart (contenu complet UX), adapter Drift transactionnel, branchement AppBootstrap.
- Lot B3 (DevBackend/QA) : tests (seed unique, non-réapparition, snapshots programme/séance corrects, catégories/isExample persistés).
- Lot F1/F2 (DevFrontend) : badge "Exemple" bibliothèque/programmes/séances, affichage category.
- Lot F3 (DevFrontend) : première ouverture / états vides, dépend du résultat du seed use case.
## Décisions Main sur questions Architect - `dart analyze` sur tous les fichiers touchés (backend + frontend) : aucune erreur, seulement dépréciations Flutter préexistantes (RadioListTile, onReorder).
1. Badge "Exemple" conservé après modification par l'utilisateur (provenance, pas immutabilité) → OK, suivre la reco Architect. - `flutter test` (suite complète, 173 tests) : 4 échecs, tous confirmés préexistants et sans rapport avec #80 (vérifiés par stash différentiel avant les changements #80) : 1 dans drift_repositories_test.dart (FK media, dette antérieure), 3 dans workout_execution_screen_test.dart (chrono score / confirmations, dette antérieure UI liée au ticket #90 précédent).
2. Contenu exemple non synchronisé au serveur par défaut → OK, suivre la reco Architect. - Aucune régression introduite par #80.
3. Catégorie `uncategorized` visible sous "Autres" dans l'UI si nécessaire → OK, suivre la reco Architect.
4. Liste complète des ~20 exercices : transmise intégralement à DevBackend par Main (spec UX complète disponible).
Prochaine étape : Git pour la branche, puis DevBackend (B1+B2+B3). **Verdict final : GO. Ticket #80 prêt à être commité (lot frontend) et clôturé.**
Prochaine étape : Git committe le lot frontend sur `feature/bibliotheque-drills-demarrage`, décide du merge vers develop (déjà fast-forward pour le backend), ticket #80 passe en closed.

View File

@ -2,7 +2,7 @@
id: "8f4ea0ec-ef5a-42e0-bcf4-9eaa751bea94" id: "8f4ea0ec-ef5a-42e0-bcf4-9eaa751bea94"
number: 80 number: 80
title: "Bibliothèque de drills basket de démarrage + séance exemple modifiable" title: "Bibliothèque de drills basket de démarrage + séance exemple modifiable"
status: "inProgress" status: "closed"
priority: "high" priority: "high"
sprint: null sprint: null
links: [] links: []
@ -10,8 +10,8 @@ agentRefs: []
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784650708413 createdAt: 1784650708413
updatedAt: 1784665470112 updatedAt: 1784698823269
version: 4 version: 7
--- ---
Constat Commercial : le socle applicatif (exercices/programmes/séances/exécution/historique) est déjà solide, mais l'app démarre vide. Les concurrents basket (94FEETOFGAME) et musculation (Hevy, JEFIT) gagnent en crédibilité grâce à un contenu de départ. Constat Commercial : le socle applicatif (exercices/programmes/séances/exécution/historique) est déjà solide, mais l'app démarre vide. Les concurrents basket (94FEETOFGAME) et musculation (Hevy, JEFIT) gagnent en crédibilité grâce à un contenu de départ.

View File

@ -1,18 +1,23 @@
--- ---
issueRef: "#81" issueRef: "#81"
version: 3 version: 5
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784665481490 updatedAt: 1784700197992
--- ---
## Spec UX (livrée) ## Lot backend — TERMINÉ, commité (ac51c16) sur feature/derniere-performance-execution
Bloc compact "Références" dans l'écran d'exécution (workout_execution_screen.dart), sous le nom de l'exercice, avant la séquence d'étapes/champs de résultat. Deux infos max : "Dernière" (résultat de la même série que l'historique le plus récent, fallback dernière série dispo) et "Record" (meilleure valeur toutes séances confondues, règle de meilleur selon type de mesure : score manuel/reps = max, score chrono = min, temps = max). États : loading, avec dernière+record, dernière seule, record seul, vide sans historique ("Première fois sur cet exercice"), vide sans mesure pertinente, erreur (non bloquant). Pour exercices à étapes : reste au niveau série dans le bloc principal, détail par étape optionnel (bottom sheet), non bloquant pour le ticket. Migration Drift v17 (sourceExerciseIdSnapshot + backfill), port ExercisePerformanceReferenceRepository, use case ExercisePerformanceReferenceUseCase.getExercisePerformanceReference. Priorité record : score > reps > time.
Exigences techniques : ## Lot frontend — TERMINÉ
- Use case `getExercisePerformanceReference(exerciseId, activeMeasures, currentSetIndex)` retournant `ExercisePerformanceReference { last, record, hasAnyHistoryForExercise }`
- Matching par identité stable de l'exercice source (pas par nom sauf fallback validé Architect), historiques d'exercices archivés restent exploitables
- Ignorer séries skipped/valeurs nulles, ne lire que historiques terminés (pas séance active)
- Chargement non bloquant, skeleton/"Chargement…", erreur non bloquante "Références indisponibles"
- Composant DevFrontend réutilisable `PerformanceReferenceCard` avec formatage temps/score selon règles UX
Prochaine étape : Architect cadre l'implémentation technique (requêtes historique, ports/use case, découpage Dev). Fichiers : workout_execution_screen.dart (composant PerformanceReferenceCard, appel use case, états UX, formatage), home_screen.dart / workout_template_screen.dart / history_screen.dart (propagation du use case depuis le bootstrap jusqu'aux points de lancement d'une séance).
Écart assumé : détail par étape (bottom sheet) non implémenté (optionnel, hors MVP). Unité affichée pour score manuel vient du snapshot courant plutôt que d'une unité historique dédiée (le DTO backend ne l'expose pas) — acceptable, cohérent avec la spec qui n'exigeait pas de tracking d'unité historique séparée.
## Vérification finale (Main)
- `dart analyze` sur tous les fichiers backend+frontend : aucune erreur, seulement lints/infos préexistants (dont les warnings BuildContext async confirmés hors du diff #81).
- `flutter test` (suite complète, 178 tests) : 4 échecs, identiques et déjà confirmés préexistants sans rapport (mêmes 4 que sur #80).
- Aucune régression introduite par #81.
**Verdict final : GO. Prêt à committer/merger/clôturer.**

View File

@ -2,7 +2,7 @@
id: "3d94d624-86a2-4f92-8766-2e5d06815f40" id: "3d94d624-86a2-4f92-8766-2e5d06815f40"
number: 81 number: 81
title: "Afficher la dernière performance / meilleur score pendant l'exécution" title: "Afficher la dernière performance / meilleur score pendant l'exécution"
status: "inProgress" status: "closed"
priority: "high" priority: "high"
sprint: null sprint: null
links: [] links: []
@ -10,8 +10,8 @@ agentRefs: []
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784650712105 createdAt: 1784650712105
updatedAt: 1784665481490 updatedAt: 1784700197992
version: 3 version: 5
--- ---
Constat Commercial : les trackers de référence (Hevy, Strong) motivent l'utilisateur en montrant la dernière série ou le record pendant qu'il saisit sa performance en cours. GameTime ne l'affiche pas encore pendant l'exécution. Constat Commercial : les trackers de référence (Hevy, Strong) motivent l'utilisateur en montrant la dernière série ou le record pendant qu'il saisit sa performance en cours. GameTime ne l'affiche pas encore pendant l'exécution.

View File

@ -907,21 +907,21 @@
"issueRef": "#80", "issueRef": "#80",
"path": "80", "path": "80",
"title": "Bibliothèque de drills basket de démarrage + séance exemple modifiable", "title": "Bibliothèque de drills basket de démarrage + séance exemple modifiable",
"status": "inProgress", "status": "closed",
"priority": "high", "priority": "high",
"sprint": null, "sprint": null,
"assignedAgentIds": [], "assignedAgentIds": [],
"updatedAt": 1784665470112 "updatedAt": 1784698823269
}, },
{ {
"issueRef": "#81", "issueRef": "#81",
"path": "81", "path": "81",
"title": "Afficher la dernière performance / meilleur score pendant l'exécution", "title": "Afficher la dernière performance / meilleur score pendant l'exécution",
"status": "inProgress", "status": "closed",
"priority": "high", "priority": "high",
"sprint": null, "sprint": null,
"assignedAgentIds": [], "assignedAgentIds": [],
"updatedAt": 1784665481490 "updatedAt": 1784700197992
}, },
{ {
"issueRef": "#82", "issueRef": "#82",