Aller au contenu

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.