Aller au contenu

PD-96 — Retour d'expérience


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 [Spécification](PD-96-specification.md) | | | 🛠️ [Plan d'implémentation](PD-96-plan.md) | | | ✅ [Critères d'acceptation](PD-96-acceptability.md) | | | 📝 **Retour d'expérience** | *(ce document)* | [← Retour à mobile-ios](../PD-195-epic.md) · [↑ Index User Story](index.md)

1. Résumé exécutif

La User Story PD-96 visait à initialiser le socle technique de l'application mobile iOS avec Expo SDK 54, TypeScript strict, tests Jest ≥ 80% coverage, et pipeline CI/CD GitLab.

L'implémentation initiale présentait 3 écarts (E-01 à E-03) identifiés en revue d'acceptabilité. Ces écarts ont été corrigés le 2025-01-11 :

  • E-01 : Spécification alignée sur SDK 54 (réalité technique)
  • E-02 : Seuil de couverture porté à 80% dans jest.config.js
  • E-03 : Husky + lint-staged installés sur tous les projets ProbatioVault

Verdict final : ✅ ACCEPTÉ (2025-01-11)


2. Points fluides

  • Initialisation Expo : projet créé et fonctionnel rapidement
  • TypeScript strict : strict: true activé, noImplicitAny, strictNullChecks opérationnels
  • Architecture modulaire : arborescence src/ complète (components, screens, services, hooks, crypto, etc.)
  • Outillage qualité : ESLint, Prettier, SonarQube configurés et intégrés
  • Scripts npm riches : lint, format, type-check, test, test:coverage, sonar disponibles
  • Dual test runner : Jest pour React Native, Vitest pour crypto ESM-only
  • Pipeline CI/CD : .gitlab-ci.yml présent avec stages lint/test/build
  • Navigation : @react-navigation configurée avec stack navigation
  • State management : Zustand intégré
  • Quality gates locaux : Husky + lint-staged bloquent les commits non conformes

3. Points difficiles

Difficulté Contexte Résolution
Compatibilité SDK Expo SDK 52 initialement spécifié mais SDK 54 requis par dépendances Spec alignée sur SDK 54
ESM vs CommonJS @noble/* packages ESM-only incompatibles avec Jest Vitest séparé maintenu
Mocks React Native Nombreux mocks manuels requis (expo-, react-native-) Documentation améliorée
Coverage branches Objectif initial 70% difficile avec code crypto défensif Seuil porté à 80%, tests ajoutés
Hermes + WebAssembly Hermes ne supporte pas WASM, impactant Argon2id Workarounds documentés
Hooks pré-commit absents Template Expo n'inclut pas husky/lint-staged Installé sur tous les projets

4. Hypothèses révélées tardivement

Hypothèse initiale Réalité découverte
Expo SDK 52 compatible avec toutes les dépendances FAUX — Certaines dépendances requièrent SDK 54+
Jest suffit pour tous les tests FAUX — Packages ESM (@noble/*) nécessitent Vitest
Coverage 70% facilement atteignable FAUX — Nécessite effort explicite, seuil porté à 80%
husky/lint-staged standard React Native FAUX — Non inclus par défaut, installation manuelle requise
Hermes supporte WebAssembly FAUX — WASM non supporté, impactant modules crypto

5. Invariants complexes à implémenter

Invariant Complexité
Dual test runner Jest (RN) + Vitest (crypto) avec merge de coverage
Mocks exhaustifs 15+ mocks pour modules natifs Expo et React Native
TypeScript strict noImplicitAny impose typage exhaustif sur tous les imports
ESLint strict Règles sonarjs + security peuvent bloquer patterns courants
Cross-platform scripts cross-env nécessaire pour Windows/Mac/Linux
Quality gates multi-projets Husky configuré différemment selon stack (app, backend, infra, site, doc)

6. Dette technique

Dette Impact Statut
SDK 54 vs spec SDK 52 Écart documentaire ✅ RÉSOLU — Spec alignée
Coverage branches 55% Non-conformité spec ✅ RÉSOLU — Seuil 80%
Absence husky/lint-staged Qualité non bloquée en local ✅ RÉSOLU — Installé
Mocks nombreux Maintenance lourde à chaque mise à jour de dépendances OUVERT
Vitest séparé Deux configurations de test à maintenir OUVERT (acceptable)

7. Risques résiduels

Risque Probabilité Impact Mitigation
Mise à jour SDK casse mocks Élevée MOYEN Tester mocks après chaque upgrade
Coverage régresse sous 80% Faible MOYEN Seuil bloquant en CI activé
Hermes limitation Faible ÉLEVÉ Workarounds WASM documentés
Drift Jest/Vitest config Moyenne FAIBLE Factoriser config commune

8. Améliorations processus

Amélioration Statut
Vérifier compatibilité SDK avant spec ✅ FAIT — Spec alignée rétroactivement
Ajouter husky/lint-staged ✅ FAIT — Installé sur 5 projets
Augmenter coverage branches ✅ FAIT — Seuil 80%
Documenter mocks dans README À FAIRE
Script test:all:coverage À FAIRE — Merger coverage Jest+Vitest

9. Enseignements clés

  1. Les specs doivent être réalistes — Spécifier SDK 52 alors que les dépendances requièrent SDK 54 crée un écart dès le départ. Valider la compatibilité avant de figer la spec.

  2. L'écosystème React Native impose des contraintes — Les packages ESM-only (@noble/*) ne fonctionnent pas avec Jest standard, nécessitant un runner alternatif (Vitest).

  3. Les hooks pré-commit ne sont pas optionnels — Sans husky/lint-staged, la qualité dépend uniquement de la CI. L'installation sur tous les projets garantit une cohérence globale.

  4. La coverage est un engagement, pas un objectif — Fixer un seuil (80%) et le rendre bloquant en CI force l'équipe à maintenir la qualité des tests.

  5. L'initialisation projet est critique — Les choix faits dans PD-96 (SDK version, test runners, mocks) impactent toutes les US suivantes. Investir du temps ici évite de la dette ailleurs.

  6. Le processus de revue fonctionne — Les 3 écarts détectés en acceptabilité ont été corrigés rapidement. Le cycle spec → implémentation → revue → correction est efficace quand il est suivi rigoureusement.