PD-106 — Retour d'Expérience (REX)¶
Généré par Claude — 2026-02-09 Story : MFA Settings Screen (iOS) Verdict final : ACCEPTÉ AVEC RÉSERVES
1. Résumé de la User Story¶
PD-106 implémente l'écran de paramètres MFA (Multi-Factor Authentication) pour l'application iOS ProbatioVault, permettant aux utilisateurs de : - Visualiser l'état de leur MFA (actif/inactif) - Activer le MFA via TOTP (QR Code + code de vérification) - Désactiver le MFA avec confirmation et re-authentification - Régénérer les codes de récupération - Accéder aux autres paramètres sensibles (changement de mot de passe, suppression de compte)
2. Statistiques du workflow¶
| Métrique | Valeur |
|---|---|
| Durée totale | 6 jours (2026-02-03 → 2026-02-09) |
| Nombre d'itérations spec | 4 (v1 → v4) |
| Nombre d'itérations Gate 8 | 2 (v1 NON_CONFORME → v2 GO) |
| Tests unitaires | 89 |
| Couverture | 80%+ |
| Fichiers créés | 20 |
| Fichiers modifiés | 5 |
3. Difficultés rencontrées¶
3.1 Intégration Jest/Expo¶
Problème : Erreur Cannot find module 'expo-clipboard' dans les tests.
Cause : Le module expo-clipboard est un package ESM qui nécessite une configuration Jest spécifique.
Solution : 1. Créer un mock manuel src/__mocks__/expo-clipboard.ts 2. Ajouter le mapping dans jest.config.js : "^expo-clipboard$": "<rootDir>/src/__mocks__/expo-clipboard.ts"
Temps perdu : ~30 minutes
3.2 Cognitive Complexity ESLint¶
Problème : MfaSettingsScreen.tsx dépassait la limite de complexité cyclomatique (19 > 15).
Cause : Ternaires imbriqués pour déterminer le style et le texte du statut MFA.
Solution : Extraction en fonctions helpers (getStatusStyle(), getStatusTitle(), getStatusDescription()).
Temps perdu : ~20 minutes
3.3 Reviews LLM via OpenCode¶
Problème : Les prompts longs (>5000 caractères) semblaient bloquer OpenCode indéfiniment.
Cause : OpenCode écrit la sortie à la fin de l'exécution, pas en streaming. Les prompts longs prennent plus de temps.
Solution : 1. Passer les prompts via stdin (cat file.txt | opencode run -) 2. Utiliser des prompts plus concis avec extraits de code
Temps perdu : ~1 heure
3.4 Gate 8 v1 - Écarts processus¶
Problème : Le verdict v1 était NON_CONFORME pour des raisons processus (pas techniques).
Écarts identifiés : - ECT-01 : Tests UI/E2E manquants - ECT-02 : Traçabilité commit absente - ECT-03 : Pipeline non vérifié - ECT-04 : Reviews LLM non exécutées
Solution : Boucle de correction complète avec ajout de tests, commit, vérification pipeline, et exécution des reviews LLM.
Temps perdu : ~2 heures (mais temps nécessaire pour la conformité)
4. Enseignements techniques¶
4.1 Patterns React Native validés¶
| Pattern | Description | Fichier exemple |
|---|---|---|
| Hook métier isolé | Toute la logique dans un hook, écran "thin" | useMfa.ts, useReauth.ts |
| useState éphémère pour secrets | Jamais AsyncStorage/SecureStore | useMfa.ts:50 |
| Cleanup au unmount | useEffect return pour purger les secrets | MfaEnrollScreen.tsx:48-55 |
| Re-auth one-time | consume() après chaque opération critique | MfaSettingsScreen.tsx:62 |
4.2 Conventions de nommage établies¶
- Écrans settings :
src/screens/settings/{Feature}Screen.tsx - Hooks métier :
src/hooks/use{Domain}.ts - Services API :
src/services/{domain}Api.ts - Tests screens :
src/__tests__/screens/settings/{Feature}Screen.test.tsx
4.3 Patterns à éviter¶
| Anti-pattern | Risque | Alternative |
|---|---|---|
console.log(secret) | Fuite en production | Logger uniquement les codes d'erreur |
AsyncStorage.setItem("totp", ...) | Persistance non sécurisée | useState éphémère |
| Ternaires imbriqués | Complexité > 15 | Fonctions helpers |
any dans les types | Perte de typage | Types explicites |
5. Enseignements processus¶
5.1 Workflow multi-agents¶
Constat : L'architecture multi-agents (Claude + ChatGPT) fonctionne bien pour la validation croisée.
Point d'attention : Les reviews ChatGPT basées sur des extraits partiels peuvent produire des faux positifs (écarts basés sur du code manquant).
Amélioration suggérée : Toujours inclure le code complet des fonctions concernées, pas seulement des extraits.
5.2 Gate PMO¶
Constat : La Gate 8 est efficace pour détecter les manquements processus.
Point positif : Les 4 critères (tests, commit, pipeline, reviews) sont tous nécessaires pour une livraison propre.
Point d'attention : Le premier passage Gate 8 peut être NON_CONFORME même avec un code techniquement correct.
5.3 OpenCode Integration¶
Constat : OpenCode permet d'automatiser les appels ChatGPT et d'éliminer les copier-coller.
Limite : Les prompts très longs peuvent prendre du temps. Préférer stdin à l'argument direct.
6. Impact sur les documents projet¶
6.1 CLAUDE.md à mettre à jour¶
Règles à ajouter : - Pattern mock expo-clipboard pour Jest - Extraction helpers pour complexité > 15 - Prompts OpenCode via stdin pour longs contextes
6.2 Templates à enrichir¶
- Template tests screens : inclure pattern de mock des hooks
- Template review sécurité : préciser que les écarts théoriques non exploitables sont des RÉSERVES
7. Métriques de qualité¶
| Métrique | Cible | Atteint |
|---|---|---|
| Couverture code | 80% | ✅ 80%+ |
| ESLint errors | 0 | ✅ 0 |
| SonarQube | PASSED | ✅ |
| Invariants respectés | 17/17 | ✅ |
| Forbidden patterns | 0 | ✅ |
8. Actions de capitalisation¶
| ID | Action | Responsable | Échéance |
|---|---|---|---|
| CAP-01 | Ajouter règles PD-106 au CLAUDE.md app | Claude | Immédiat |
| CAP-02 | Documenter pattern mock expo-clipboard | Claude | Immédiat |
| CAP-03 | Créer template tests screens | Backlog | - |
9. Conclusion¶
L'implémentation PD-106 est livrée avec un verdict ACCEPTÉ AVEC RÉSERVES. Les réserves concernent : - Couverture TC-* partielle (7/12) — compensée par coverage 80%+ - Améliorations sécurité théoriques (consume() + timestamp) — non bloquantes
Le workflow en 10 étapes avec gates PMO a démontré son efficacité pour garantir la qualité et la traçabilité.
Prochaines étapes : Intégration backend pour les endpoints MFA réels.