chore(tickets): met à jour le suivi du ticket #83 (rapport QA GO)

Ticket #83 validé GO par QA, écarts mineurs non bloquants notés au carnet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 13:06:48 +02:00
parent c9e0810a64
commit d6626f17fa

View File

@ -827,3 +827,80 @@ Git doit créer la branche #83. Ensuite DevBackend peut prendre B1 -> B2 -> B3 ;
- `HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart format --set-exit-if-changed test/presentation/exercise_library_screen_test.dart` : OK.
- `HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart analyze lib/presentation/exercise_library_screen.dart lib/presentation/program_screen.dart lib/presentation/workout_template_screen.dart lib/presentation/library_tags.dart test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart` : exit 0 ; 14 infos restantes, toutes sur dépréciations existantes du périmètre, pas d'erreur.
- `flutter test --no-pub test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart` : non exécutable dans ce sandbox, échec avant tests sur cache Flutter en lecture seule (`engine.stamp.tmp.32`, `engine.realm`).
# QA — Validation fonctionnelle #83
## Périmètre relu
- Cadrage complet UX / Architect / DevBackend / DevFrontend lu via `idea_ticket_read("#83", includeCarnet=true)`.
- Fichiers relus : `lib/presentation/library_tags.dart`, `lib/presentation/exercise_library_screen.dart`, `lib/presentation/program_screen.dart`, `lib/presentation/workout_template_screen.dart`, `test/presentation/exercise_library_screen_test.dart`, `test/presentation/program_screen_test.dart`, `test/presentation/workout_template_screen_test.dart`, `test/application/use_cases_test.dart`, `test/infrastructure/drift_repositories_test.dart`.
## Cohérence UX / implémentation
- Tags : composant partagé avec badges max 3 + `+N`, filtres `FilterChip`, bottom sheet `Ajouter un tag`, champ `Nom du tag`, suggestions `Tags existants`, bottom sheet `Voir tous les tags` avec `Rechercher un tag`.
- Règles tags : normalisation via domaine (`trim`, espaces collapsés, minuscules), limite 8, limite 24, doublons rejetés, messages UX mappés (`Saisis un tag.`, `Un tag contient 24 caractères maximum.`, `Ce tag est déjà ajouté.`, `Tu peux ajouter jusqu'à 8 tags.`).
- Filtrage : recherche + tags sur programmes/séances, recherche + mesures + tags sur exercices, logique AND via `filterByRequiredTags`, suggestions triées usage décroissant puis alpha via `tagSuggestionsFor`, section `Tags` masquée si aucune suggestion.
- États vides : messages filtrés exacts présents pour exercices/programmes/séances avec action `Effacer les filtres`; messages bibliothèque vide conservés.
- Duplication programme : menu `Actions` avec `Dupliquer` / `Supprimer`, suppression visible retirée, appel `ProgramUseCases.duplicate`, ouverture directe édition copie, snackbar exacte `Programme dupliqué. Ajuste la copie avant de l'utiliser.`, échec `Duplication impossible pour le moment.`.
- Duplication séance : bouton `Lancer` visible conservé, menu `Actions` avec `Dupliquer` / `Supprimer`, appel `WorkoutTemplateUseCases.duplicate`, ouverture directe édition copie, snackbar exacte `Séance dupliquée. Ajuste la copie avant de la lancer.`, échec `Duplication impossible pour le moment.`.
- Pas de duplication d'exercice de bibliothèque ajoutée. Le seul `Dupliquer` trouvé dans `exercise_library_screen.dart` concerne les étapes internes d'un exercice, hors périmètre #83 et préexistant à la logique de composition.
Écart relevé non bloquant : les boutons de menu utilisent le tooltip `Actions` plutôt que le symbole textuel `...`; l'emplacement et le contenu du menu respectent le cadrage.
## Couverture de test relue
- Tests application : normalisation/validation tags, doublons, limite 8, limite 24, filtre AND, suggestions triées, duplication programme profonde avec conflit de nom, tags copiés, `isExample=false`, nouveaux IDs enfants, indépendance source/copie, duplication séance profonde avec remap overrides, conflit de nom, tags copiés, `isExample=false`, `lastStartedAt=null`.
- Tests infra : colonnes `tags_json` + schemaVersion 19, save/load tags normalisés, payload sync avec tags, payload ancien sans tags -> `[]`, persistance duplication programme et séance avec enfants/remap overrides.
- Tests widget : ajout tag exercice sauvegardé normalisé, filtres tags exercices/programmes/séances avec `Effacer les filtres`, duplication programme/séance ouvrant l'édition de copie et snackbar succès.
Limite de couverture non bloquante : je n'ai pas vu de test widget dédié à la bottom sheet `Voir tous les tags` (>12 suggestions) ni aux messages d'erreur de tags dans la bottom sheet, mais ces règles sont couvertes au niveau domaine/helper et le composant partagé mappe explicitement les messages.
## Commandes exécutées par QA
Commande :
```sh
HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart analyze lib/presentation/library_tags.dart lib/presentation/exercise_library_screen.dart lib/presentation/program_screen.dart lib/presentation/workout_template_screen.dart test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart
```
Sortie réelle pertinente :
```text
Analyzing library_tags.dart, exercise_library_screen.dart, program_screen.dart, workout_template_screen.dart, exercise_library_screen_test.dart, program_screen_test.dart, workout_template_screen_test.dart, use_cases_test.dart, drift_repositories_test.dart...
14 issues found.
```
Verdict commande : exit code 0 ; les 14 issues sont des infos de dépréciation existantes sur le périmètre UI.
Commande :
```sh
HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/flutter test --no-pub test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart
```
Sortie réelle :
```text
/opt/flutter/bin/internal/update_engine_version.sh: line 71: /opt/flutter/bin/cache/engine.stamp.tmp.24: Read-only file system
/opt/flutter/bin/internal/update_engine_version.sh: line 78: /opt/flutter/bin/cache/engine.realm: Read-only file system
```
Verdict commande : non exécutée, blocage environnement Flutter cache read-only avant lancement des tests.
Commande :
```sh
HOME=/tmp DART_SUPPRESS_ANALYTICS=1 /opt/flutter/bin/cache/dart-sdk/bin/dart test test/presentation/exercise_library_screen_test.dart test/presentation/program_screen_test.dart test/presentation/workout_template_screen_test.dart test/application/use_cases_test.dart test/infrastructure/drift_repositories_test.dart
```
Sortie réelle :
```text
Running build hooks...Running build hooks...Got socket error trying to find package flutter_launcher_icons at https://pub.dev.
```
Verdict commande : non exécutée jusqu'au vert, blocage réseau/build hooks.
## Verdict QA
**GO QA pour #83**, sous réserve explicite que cette session n'a pas pu relancer `flutter test` à cause du sandbox. La vérification Main sur suite complète reste la preuve automatisée fonctionnelle : `flutter test --no-pub` -> 214 tests, 1 seul échec préexistant FK media sans lien #83. La lecture QA ne trouve pas d'écart bloquant avec le cadrage UX/Architect.