` conteneur avec des boutons séparés côte à côte
+- Si toute la ligne doit être cliquable, séparer la zone de clic principale (bouton content) de l'action secondaire (bouton étoile/action)
+- **Signal review** : dans tout composant liste avec actions inline, vérifier qu'aucun élément interactif n'est imbriqué dans un autre
+
+- Contexte technique : HTML / accessibilité — RL799_V2 06-04-2026
+
+---
+
+
+## Fire-and-forget sans feedback sur actions non-critiques
+
+### Risques
+
+- Une action asynchrone non-critique (cache IndexedDB, analytics, sync) lancée en fire-and-forget sans feedback masque les échecs
+- L'utilisateur croit que l'action est faite (ex: document disponible hors-ligne) alors qu'elle a échoué
+
+### Symptômes
+
+- `.then(...).catch(() => {})` sur une action secondaire
+- `catch { /* ignore */ }` sans log ni feedback visuel
+
+### Bonnes pratiques / mitigations
+
+- Même si l'action est non-bloquante, afficher un feedback discret en cas d'échec (toast, badge absent)
+- L'utilisateur doit pouvoir distinguer "fait" de "échoué silencieusement"
+- **Signal review** : tout `.catch(() => {})` ou `catch { /* ignore */ }` mérite au minimum un log ou un feedback visuel
+
+- Contexte technique : frontend / actions async — RL799_V2 07-04-2026
diff --git a/knowledge/frontend/risques/navigation.md b/knowledge/frontend/risques/navigation.md
index 899b984..f68f670 100644
--- a/knowledge/frontend/risques/navigation.md
+++ b/knowledge/frontend/risques/navigation.md
@@ -5,7 +5,7 @@ bucket: risques
tags: [navigation, expo-router, vue-router, vue, zustand, useeffect, deep-link, a11y]
applies_to: [implementation, review, debug]
severity: high
-validated_on: 2026-04-02
+validated_on: 2026-04-07
source_projects: [app-alexandrie, RL799_V2]
---
@@ -232,3 +232,25 @@ const routes = [
- Règle : un élément de navigation désactivé ne doit jamais être un lien
- Utiliser un élément non interactif (`span`) ou un vrai contrôle désactivable (`button disabled`) selon le besoin
- Contexte technique : Vue 3 / Vue Router 4 / accessibilité — RL799_V2, 02-04-2026
+
+---
+
+
+## État local initialisé depuis un query param de route sans synchronisation réactive
+
+### Risques
+
+- Un formulaire branché sur un query param de route peut soumettre un identifiant obsolète si la prop initiale est copiée une seule fois dans un état local
+- Le bug est discret et passe facilement les tests textuels
+
+### Symptômes
+
+- Composant qui copie `route.query.id` dans un `ref()` au montage sans `watch`
+- Navigation intra-page (même composant, query param différent) qui soumet l'ancien identifiant
+
+### Bonnes pratiques / mitigations
+
+- Quand un composant initialise un état local depuis une prop liée au router (ex: `route.query.*`), ajouter une synchronisation réactive explicite (`watch` sur la prop) ou utiliser directement la prop si possible
+- Ajouter un test qui valide la synchro sur changement de query param (même composant réutilisé, navigation intra-page)
+
+- Contexte technique : Vue 3 / Vue Router 4 — RL799_V2 02-04-2026
diff --git a/knowledge/frontend/risques/performance.md b/knowledge/frontend/risques/performance.md
index 2d707cd..7bcd1db 100644
--- a/knowledge/frontend/risques/performance.md
+++ b/knowledge/frontend/risques/performance.md
@@ -55,3 +55,26 @@ const handleToggle = useCallback((id: string) => { ... }, []); // stable ✓
- Contexte technique : React — app-template-resto 22-03-2026
+---
+
+
+## Fetch sans timeout pour ressources lourdes
+
+### Risques
+
+- `fetch()` sans timeout pour charger des blobs/fichiers volumineux (PDF, images) laisse l'utilisateur attendre indéfiniment sur connexion dégradée
+- Critique sur mobile avec connexion instable ; faux sentiment de freeze pour l'utilisateur
+
+### Symptômes
+
+- `fetch(url)` sans `AbortController` + timeout pour des blobs/fichiers volumineux
+- Spinner infini sans message d'erreur
+
+### Bonnes pratiques / mitigations
+
+- Utiliser `AbortController` avec `setTimeout` (15s recommandé)
+- Attraper `AbortError` et afficher un message explicite à l'utilisateur
+- **Signal review** : tout `fetch` de blob/fichier sans `AbortController` est suspect
+
+- Contexte technique : frontend / mobile — RL799_V2 06-04-2026
+
diff --git a/knowledge/frontend/risques/tests.md b/knowledge/frontend/risques/tests.md
index 955c002..5005cdb 100644
--- a/knowledge/frontend/risques/tests.md
+++ b/knowledge/frontend/risques/tests.md
@@ -5,8 +5,8 @@ bucket: risques
tags: [tests, jest, react-native, ts-jest, coverage, facade]
applies_to: [analysis, implementation, review, debug]
severity: high
-validated_on: 2026-03-31
-source_projects: [app-alexandrie, app-template-resto]
+validated_on: 2026-04-07
+source_projects: [app-alexandrie, app-template-resto, RL799_V2]
---
# Frontend — Risques & vigilance : Tests
@@ -122,3 +122,29 @@ source_projects: [app-alexandrie, app-template-resto]
- **Règle** : un test qui ne vérifie que des helpers adjacents ne peut pas clôturer une tâche d'intégration.
- Contexte technique : TypeScript / Jest — app-template-resto 31-03-2026
+
+---
+
+
+## Tests de présence textuelle = faux garde-fou de non-régression
+
+### Risques
+
+- Des tests basés uniquement sur `content.includes(...)` valident du texte statique tout en laissant passer des régressions réelles sur auth/API et comportements UI
+- Les AC fonctionnels sont déclarés validés alors que le flux réel (autosave, submit, transitions d'état) n'est pas exercé
+
+### Symptômes
+
+- Tests qui lisent le fichier `.vue` et assertent uniquement des chaînes (`includes`) sans exécuter le composant ni ses interactions
+- Story cochée malgré des régressions fonctionnelles invisibles aux tests verts
+- Services API et guards d'accès validés par des assertions textuelles au lieu de tests comportementaux
+
+### Bonnes pratiques / mitigations
+
+- Exiger au moins un test comportemental par flux critique (montage composant + interaction + assertion d'effet)
+- Reléguer les tests textuels au rôle de smoke structurel non bloquant
+- Pour les services API et guards d'accès : exiger un test exécutant réellement la fonction (mock fetch/session/router) et validant statuts d'erreur + contrat d'appel
+- Pour les templates/checklists critiques : ne pas se limiter à la présence de mots-clés, valider la structure attendue (sections obligatoires, champs non vides, format minimal)
+- **Règle** : si un test vérifie un *comportement* (ex: "le menu se ferme après clic"), il doit monter le composant, pas chercher une string dans le source
+
+- Contexte technique : Vue 3 / node:test — RL799_V2 02-04-2026
diff --git a/knowledge/workflow/risques/story-tracking.md b/knowledge/workflow/risques/story-tracking.md
index 6b2b98e..244c4df 100644
--- a/knowledge/workflow/risques/story-tracking.md
+++ b/knowledge/workflow/risques/story-tracking.md
@@ -5,8 +5,8 @@ bucket: risques
tags: [bmad, story, file-list, review, completion]
applies_to: [analysis, implementation, review]
severity: high
-validated_on: 2026-03-31
-source_projects: [app-alexandrie, app-template-resto]
+validated_on: 2026-04-07
+source_projects: [app-alexandrie, app-template-resto, RL799_V2]
---
# Workflow — Risques & vigilance : Story tracking
@@ -105,3 +105,125 @@ source_projects: [app-alexandrie, app-template-resto]
- Tout fichier listé avec un chemin inexistant en git → signaler en **HIGH**.
- Contexte technique : BMAD / workflow agent — app-template-resto 31-03-2026
+
+---
+
+
+## Story "review" non alignée avec la réalité du diff
+
+### Risques
+
+- La File List, les Completion Notes et les tâches `[x]` ne reflètent pas la réalité de `git diff` / `git status`
+- Des régressions de tests passent inaperçues si le statut `review` est accordé sans croisement avec le diff
+- Des fichiers créés dans un commit antérieur (ex: commit de refonte UI) sont listés dans la story sans traçabilité explicite
+
+### Symptômes
+
+- `git diff --name-only` montre des fichiers absents de la File List (ou inversement)
+- Completion Notes contenant des déclarations contredites par le diff réel
+- Tâches `[x]` "tests impactés passent" alors que des tests cassent sur des fichiers modifiés dans la story
+- Fichiers listés dans la File List absents de `git diff HEAD~1..HEAD` pour le commit story
+
+### Bonnes pratiques / mitigations
+
+- **Avant passage en review** : comparer `File List` vs `git diff --name-only` + `git status --porcelain`
+- Refuser le statut `review` si un fichier source de la story manque de la File List
+- Exiger une section "preuves de validation" quand une tâche mentionne une validation UX/Dev
+- Exiger un run de tests sur le périmètre touché, avec mention explicite des échecs non liés
+- Si des fichiers sont répartis sur plusieurs commits, mentionner explicitement dans la File List le commit d'introduction de chaque fichier
+
+- Contexte technique : BMAD / workflow agent — RL799_V2 02-04-2026
+
+---
+
+
+## Quality gate déclaratif non exécutable
+
+### Risques
+
+- Une story impose un gate process (PR template, checklist obligatoire) mais aucun mécanisme de contrôle vérifiable n'existe
+- En review, cela crée un faux sentiment de contrôle et laisse passer des PR non conformes
+
+### Symptômes
+
+- Story qui déclare un quality gate via documentation/template sans CI check, script de validation, ni evidence review tracée
+- AC marqués ✅ sur la base d'un template rempli mais sans preuve d'exécution
+
+### Bonnes pratiques / mitigations
+
+- La review doit vérifier au moins un mécanisme de contrôle actionnable (CI check, script de validation, required field policy, ou evidence review tracée)
+- Sans ce mécanisme, classer les AC comme PARTIAL et repasser la story en `in-progress`
+
+- Contexte technique : BMAD / workflow agent — RL799_V2 02-04-2026
+
+---
+
+
+## AC dépendante d'une capacité non supportée par le contrat technique
+
+### Risques
+
+- Un AC demande un comportement impossible avec le contrat courant (ex: multi-rôles alors que le JWT expose un rôle scalaire)
+- Sans clarification explicite dans la story, la review crée des allers-retours et des faux écarts
+
+### Symptômes
+
+- AC mentionnant une capacité que le token, le schéma ou l'API ne supporte pas actuellement
+- Dev qui implémente un workaround non documenté pour satisfaire l'AC
+
+### Bonnes pratiques / mitigations
+
+- Si un AC dépend d'une capacité non supportée par le contrat actuel (token, schéma, API), documenter explicitement la contrainte dans la story
+- Marquer la capacité hors-scope tant que le contrat n'est pas migré
+- Exiger une note Dev Notes + alignement Tasks/Tests sur cette contrainte
+
+- Contexte technique : BMAD / workflow agent — RL799_V2 02-04-2026
+
+---
+
+
+## Tâches [x] validées par tests textuels au lieu de tests comportementaux
+
+### Risques
+
+- Une story passe en review avec des tâches `[x]` dont la preuve repose uniquement sur des assertions textuelles (`content.includes(...)`) sans exécuter le flux réel
+- Les tests de présence textuelle valident des labels mais pas les cibles de navigation, ni les transitions d'état
+
+### Symptômes
+
+- Tests qui passent en vérifiant uniquement la présence de chaînes dans les fichiers source
+- AC fonctionnels non réellement garantis (toast, mise à jour réactive, soumission) malgré un statut story en `review`
+- Tests `content.includes(...)` valident des labels mais pas les `to`/`href` de navigation
+
+### Bonnes pratiques / mitigations
+
+- Toute tâche de test marquée `[x]` doit inclure au moins un test comportemental exécutable (pas seulement `content.includes(...)`)
+- En cas de tests purement textuels, classer la tâche comme non validée et repasser la story en `in-progress`
+- Pour toute AC mentionnant "clic" ou "navigation", imposer une vérification des cibles (`:to`, `href`, route name)
+- **Règle** : un test qui ne vérifie que des helpers adjacents ou des chaînes statiques ne peut pas clôturer une tâche d'intégration
+
+- Contexte technique : BMAD / workflow agent — RL799_V2 02-04-2026
+
+---
+
+
+## Agents autonomes et dérive des contrats partagés
+
+### Risques
+
+- Après une session multi-agents, les types/DTOs sont redéfinis localement dans chaque service au lieu d'utiliser le package shared
+- La dérive est détectée uniquement lors d'une review globale de cohérence, pas pendant l'implémentation
+
+### Symptômes
+
+- Types définis localement dans `apps/frontend/src/services/` au lieu d'être importés depuis `packages/shared`
+- Plusieurs services avec le même type défini indépendamment, avec des divergences subtiles
+- Détection : `grep -r 'type.*=' apps/frontend/src/services/ | grep -v 'import'`
+
+### Bonnes pratiques / mitigations
+
+- Inclure dans le prompt d'agent une instruction explicite : "créer les DTOs dans `packages/shared` AVANT d'écrire le service frontend"
+- Ajouter une review globale de cohérence après toute session multi-stories
+- **Règle review** : tout type défini localement qui correspond à un DTO existant dans shared est une régression
+
+- Contexte technique : BMAD / agents autonomes — RL799_V2 07-04-2026