docs(ideai): mémoire, sprint et tickets du chantier exercices à étapes

Ajoute les notes mémoire d'architecture et UX pour les exercices à
étapes, un nouveau sprint, clôture le ticket #56 et reflète les
tickets #46/#53, ajoute le cadrage des tickets #57 à #63.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 19:32:33 +02:00
parent b1182db32e
commit 733b7bb597
27 changed files with 920 additions and 19 deletions

View File

@ -1,6 +1,6 @@
---
issueRef: "#46"
version: 4
version: 6
updatedBy: {"kind":"user"}
updatedAt: 1784380502263
updatedAt: 1784482343900
---

View File

@ -1,16 +1,16 @@
---
id: "dda499ac-7197-4321-bd2b-a303510b1bbe"
number: 46
title: "Créer un application headless serveur pour l'application"
title: "Créer un serveur headless pour l'application"
status: "open"
priority: "low"
sprint: null
sprint: "4237adfd-91eb-45ff-9f32-6ce1daa39822"
links: []
agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1784379695135
updatedAt: 1784380502263
version: 4
updatedAt: 1784482343900
version: 6
---
J'aimerais que l'application puisse proposer des services online aussi. Un peu a la manière de Heavy avec la possibilité de partager ses séances etc. A la manière de Heavy, j'aimerais que l'on puisse se créer un compte et s'y connecter, synchroniser son historique de seances, ses séances, ses programmes ainsi que ses exercices. Ce ticket est la partie serveur/web API, il faudra que ça soit un serveur headless linux qui tourne dans un container docker. Il faudra que je puisse y acceder via un reverse proxy qui tourne sur une machine différente de celle du serveur headless mais dans le même réseau local. J'y accederais via une adresse https. le container se lancera ensuite à partir d'un docker-compose.yaml dans lequel tu laissera les champs libre de tout ce qui sera necessaire de configurer (adresse ip du reverse proxy, de la machine sur laquelle tourne le docker si necessaire etc.). Pour la création du serveur, créé un subdirectory spécialement pour cette partie serveur. Dans le dossier serveur à lma racine, je veux un script pour pouvoir push le container sur le gitea qui est déjà lié au projet, je veux aussi le docker-compose.yaml demandé.

View File

@ -1,6 +1,9 @@
---
issueRef: "#53"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784412015509
version: 3
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1784469423570
---
Contrat `server/openapi.yaml` (OpenAPI 3.0.3) documentant les 11 endpoints réels (health, auth register/login/logout, sync push/pull/exchange, shares create/inbox/accept/decline/revoke) avec sécurité bearerAuth et schémas de requêtes/réponses fidèles au code. Trou de couverture comblé : tests API HTTP directs pour les endpoints auth (register/login/logout), qui n'étaient testés qu'au niveau use case/middleware. `server/docs/integration-checklist.md` ajouté pour lister tout ce qui reste à vérifier manuellement une fois un vrai Docker/PostgreSQL disponible. Suite complète serveur verte (29/29), `dart analyze` clean.
Non vérifié, pour toute la suite du chantier serveur #47-#53 (limite d'environnement du sandbox Main, pas d'accès Docker daemon) : aucun `docker build`/`docker compose up` réel, aucun test contre un vrai PostgreSQL, aucun appel HTTP de bout en bout sur le serveur réellement démarré avec DB. Tout le reste (logique métier, SQL relu manuellement, syntaxe Docker Compose validée via `docker compose config`, 29 tests avec fakes en mémoire) est vérifié. Voir `server/docs/integration-checklist.md` pour la checklist complète à dérouler quand Docker sera disponible.

View File

@ -2,15 +2,15 @@
id: "d5fce252-f3c4-499f-ad0a-d3c81ea13305"
number: 53
title: "[Server] Tests API, contrats OpenAPI et vérification d'intégration"
status: "open"
status: "qa"
priority: "low"
sprint: null
links: [{"target":"#46","kind":"relatesTo"},{"target":"#50","kind":"dependsOn"},{"target":"#51","kind":"dependsOn"},{"target":"#52","kind":"dependsOn"}]
agentRefs: []
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1784412015509
updatedAt: 1784412015509
version: 1
updatedAt: 1784469423570
version: 3
---
Ajouter la couverture de validation serveur : tests unitaires domain/application, tests repository PostgreSQL, tests API auth/sync/share, fixtures de payload GameTime, vérification Docker Compose locale. Produire un contrat OpenAPI ou équivalent documentant auth, sync et partage pour les futurs tickets d'intégration Flutter.

View File

@ -0,0 +1,6 @@
---
issueRef: "#56"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481516635
---

View File

@ -0,0 +1,16 @@
---
id: "c902b71c-8033-42dc-a52a-eb6822a1e863"
number: 56
title: "[DevBackend] Modèle domain + Drift pour exercices à étapes"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"}]
agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481516635
updatedAt: 1784481516635
version: 1
---
Implémenter le socle domain et Drift pour les exercices à étapes. Ajouter `ExerciseStep`, enum `ExerciseStepType time|reps`, liste `steps` sur `Exercise`, validation max 8 étapes, positions uniques, cible par défaut > 0, score d'étape optionnel avec `ScoreInputMode manual|stopwatch`, label/unité/valeurs par défaut. Ajouter snapshots d'étapes dans `ProgramExercise.toSnapshotJson` et dans les snapshots WorkoutTemplate/History. Migration Drift depuis schemaVersion 7 vers 8 : tables/colonnes nécessaires, contraintes et mappers repository.

View File

@ -0,0 +1,6 @@
---
issueRef: "#57"
version: 4
updatedBy: {"kind":"user"}
updatedAt: 1784482343900
---

View File

@ -0,0 +1,16 @@
---
id: "d5b0bd7e-a021-4824-a278-b2e9c14a1cf6"
number: 57
title: "Allimenter la mémoire projet pour l'UI online de l'app"
status: "open"
priority: "medium"
sprint: "4237adfd-91eb-45ff-9f32-6ce1daa39822"
links: []
agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1784481519943
updatedAt: 1784482343900
version: 4
---
L'application aura donc une couche online. L'application se veut cependant rester un maximum offline sur les ofnctionnalités de base. Je veux que cette couche online soit le plus transparente possible pour l'utilisateur. En clair, si le serveur n'est pas disponible, je ne veux pas de popup qui lui dise qu'il n'est pas connecté. Le but, c'est que les informations soient autant que possibles stockées en local pour tout ce qui est necessaire au bon affichage de l'application sans pour autant donner de mauvaises ou de fausses informations (par exemple, garder les exercices créés, les programmes, les séances etc en local, si plus tard on calcule des statistiques pareilles, les garder aussi en local, si il y a un systeme de compte, garder la photo de profile ainsi que le pseudo etc en local. En bref la référence reste encore une fois Heavy qui fait très bien ça). Ajoute ceci à la mémoire du projet pour les futurs features qui traiteront de ça.

View File

@ -0,0 +1,6 @@
---
issueRef: "#58"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481524706
---

View File

@ -0,0 +1,16 @@
---
id: "d18752bf-3e5b-4fb9-935c-064d0d2e837a"
number: 58
title: "[DevBackend] Exécution persistante des étapes et résultats par passage"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"},{"target":"#56","kind":"dependsOn"}]
agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481524706
updatedAt: 1784481524706
version: 1
---
Ajouter le modèle d'exécution des étapes distinct de `ActiveSetResult`. Créer une table dédiée type `ActiveExerciseStepProgressState` pour session+position de série, passage courant, étape courante, statut `idle|running|stopped`, `startedAt`, `accumulatedMs`, et actions pause/reprise/skip. Créer `ActiveExerciseStepResult` pour résultats par `activeWorkoutSessionId + programIndex + exerciseIndex + setIndex + passageIndex + stepSnapshotId/stepIndex`, statut `completed|skipped`, durée/rep cible snapshot, score manuel ou score chrono d'étape. À la clôture de séance, projeter vers `WorkoutHistoryStepResult` sans mélanger avec `WorkoutHistorySetResult`.

View File

@ -0,0 +1,6 @@
---
issueRef: "#59"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481530478
---

View File

@ -0,0 +1,16 @@
---
id: "be486426-a17d-4521-b475-9230a2e30169"
number: 59
title: "[DevFrontend] Éditeur d'exercice avec séquence d'étapes"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"},{"target":"#56","kind":"dependsOn"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481530478
updatedAt: 1784481530478
version: 1
---
Implémenter la section UX `Séquence d'étapes` dans `ExerciseFormScreen` : activation optionnelle, ajout/réordonnancement max 8, écran de détail d'étape, type exclusif temps/répétitions, cible obligatoire > 0, score d'étape optionnel avec mode manual/stopwatch. Préserver l'avertissement existant sur les exercices déjà utilisés : les programmes existants gardent leurs snapshots.

View File

@ -0,0 +1,6 @@
---
issueRef: "#60"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481536357
---

View File

@ -0,0 +1,16 @@
---
id: "4807a946-834e-44a4-8a39-25ad951e6668"
number: 60
title: "[DevFrontend] Exécution de séance avec module séquence et bips"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"},{"target":"#58","kind":"dependsOn"},{"target":"#59","kind":"dependsOn"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481536357
updatedAt: 1784481536357
version: 1
---
Implémenter le module `Séquence` sur l'écran d'exécution : affichage passage/étape, étapes temps avec compte à rebours, étapes répétitions avec validation manuelle, boucle multi-passages si reps de série actives, skips distincts étape/passage/série, persistance après pause/kill via use cases backend. Ajouter un port audio testable et un adapter Flutter utilisant des bips courts/longs, sans dépendance des tests widget à un lecteur audio réel.

View File

@ -0,0 +1,6 @@
---
issueRef: "#61"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481541650
---

View File

@ -0,0 +1,16 @@
---
id: "1eed02ec-04af-4966-a0ff-449c4a957ea0"
number: 61
title: "[DevFrontend] Plan de séance et historique avec résultats d'étapes"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"},{"target":"#58","kind":"dependsOn"}]
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481541650
updatedAt: 1784481541650
version: 1
---
Afficher les résultats d'étapes dans le plan de séance et l'historique sans remplacer les résultats de série. Une série avec étapes garde son état global `à faire/en cours/terminée/passée`; le détail affiche les passages, étapes terminées/passées, durées/répétitions et scores d'étape. L'édition ponctuelle d'une série passée/terminée permet de corriger les valeurs enregistrées sans rejouer la séquence interactive et sans déplacer la progression courante.

View File

@ -0,0 +1,6 @@
---
issueRef: "#62"
version: 1
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedAt: 1784481549150
---

View File

@ -0,0 +1,16 @@
---
id: "a53d84b5-06d9-4683-ac64-9100cb60669f"
number: 62
title: "[QA] Validation exercices à étapes, persistance et historique"
status: "open"
priority: "medium"
sprint: null
links: [{"target":"#54","kind":"relatesTo"},{"target":"#60","kind":"dependsOn"},{"target":"#61","kind":"dependsOn"}]
agentRefs: [{"agentId":"7efa512f-3b3a-47b5-ade0-a2dd13073055","role":"assigned"}]
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
createdAt: 1784481549150
updatedAt: 1784481549150
version: 1
---
Préparer et exécuter le plan QA pour les exercices à étapes : création/édition et limites max 8, snapshots programme/séance, exécution étapes temps/répétitions, bips 3/2/1/0, enchaînement de chronos, skips étape/passage/série, pause/reprise/kill app, projection historique, édition ponctuelle sans déplacer la progression ni mélanger résultats d'étape et résultats de série.

View File

@ -0,0 +1,6 @@
---
issueRef: "#63"
version: 6
updatedBy: {"kind":"user"}
updatedAt: 1784482343900
---

View File

@ -0,0 +1,16 @@
---
id: "17f54d9f-0317-429d-a275-480966976ced"
number: 63
title: "Ajouter les features déjà présentes sur le serveur au client"
status: "open"
priority: "medium"
sprint: "4237adfd-91eb-45ff-9f32-6ce1daa39822"
links: [{"target":"#57","kind":"dependsOn"},{"target":"#46","kind":"dependsOn"}]
agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}]
createdBy: {"kind":"user"}
updatedBy: {"kind":"user"}
createdAt: 1784482089895
updatedAt: 1784482343900
version: 6
---
Une première version du serveur est disponible. J'aimerais que les features serveur soient ajouté à l'application. Le bon fonctionnement de l'applciation reste prioritaire sur le serveur, à savoir que le serveur sert l'applciation et pas l'inverse, c'est a dire que si une structure de donnée est actuellement différente entre le serveur et l'applciation, alors il faut modifier le serveur pour qu'il accepte la donnée du client. Je pense par exemple aux exercices, entre la création serveur et la réalisation du ticket, je pense que la forme des exercice a été modifiée (ajout entre autre des étapes dans une serie d'un exercice), il faudra alors adapter le serveur à ça.

View File

@ -1,3 +1,3 @@
{
"nextNumber": 55
"nextNumber": 64
}

View File

@ -524,14 +524,14 @@
{
"issueRef": "#46",
"path": "46",
"title": "Créer un application headless serveur pour l'application",
"title": "Créer un serveur headless pour l'application",
"status": "open",
"priority": "low",
"sprint": null,
"sprint": "4237adfd-91eb-45ff-9f32-6ce1daa39822",
"assignedAgentIds": [
"57695b92-24d0-4876-837c-76116e70a6ae"
],
"updatedAt": 1784380502263
"updatedAt": 1784482343900
},
{
"issueRef": "#47",
@ -597,11 +597,11 @@
"issueRef": "#53",
"path": "53",
"title": "[Server] Tests API, contrats OpenAPI et vérification d'intégration",
"status": "open",
"status": "qa",
"priority": "low",
"sprint": null,
"assignedAgentIds": [],
"updatedAt": 1784412015509
"updatedAt": 1784469423570
},
{
"issueRef": "#54",
@ -614,6 +614,102 @@
"57695b92-24d0-4876-837c-76116e70a6ae"
],
"updatedAt": 1784451193831
},
{
"issueRef": "#56",
"path": "56",
"title": "[DevBackend] Modèle domain + Drift pour exercices à étapes",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"10ee045b-1c41-479e-ba03-dceed9edd495"
],
"updatedAt": 1784481516635
},
{
"issueRef": "#57",
"path": "57",
"title": "Allimenter la mémoire projet pour l'UI online de l'app",
"status": "open",
"priority": "medium",
"sprint": "4237adfd-91eb-45ff-9f32-6ce1daa39822",
"assignedAgentIds": [
"57695b92-24d0-4876-837c-76116e70a6ae"
],
"updatedAt": 1784482343900
},
{
"issueRef": "#58",
"path": "58",
"title": "[DevBackend] Exécution persistante des étapes et résultats par passage",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"10ee045b-1c41-479e-ba03-dceed9edd495"
],
"updatedAt": 1784481524706
},
{
"issueRef": "#59",
"path": "59",
"title": "[DevFrontend] Éditeur d'exercice avec séquence d'étapes",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784481530478
},
{
"issueRef": "#60",
"path": "60",
"title": "[DevFrontend] Exécution de séance avec module séquence et bips",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784481536357
},
{
"issueRef": "#61",
"path": "61",
"title": "[DevFrontend] Plan de séance et historique avec résultats d'étapes",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
],
"updatedAt": 1784481541650
},
{
"issueRef": "#62",
"path": "62",
"title": "[QA] Validation exercices à étapes, persistance et historique",
"status": "open",
"priority": "medium",
"sprint": null,
"assignedAgentIds": [
"7efa512f-3b3a-47b5-ade0-a2dd13073055"
],
"updatedAt": 1784481549150
},
{
"issueRef": "#63",
"path": "63",
"title": "Ajouter les features déjà présentes sur le serveur au client",
"status": "open",
"priority": "medium",
"sprint": "4237adfd-91eb-45ff-9f32-6ce1daa39822",
"assignedAgentIds": [
"57695b92-24d0-4876-837c-76116e70a6ae"
],
"updatedAt": 1784482343900
}
]
}