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: trueactivé,noImplicitAny,strictNullChecksopé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,sonardisponibles - Dual test runner : Jest pour React Native, Vitest pour crypto ESM-only
- Pipeline CI/CD :
.gitlab-ci.ymlpré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 |
|---|---|---|
| ✅ RÉSOLU — Spec alignée | ||
| ✅ RÉSOLU — Seuil 80% | ||
| ✅ 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 |
|---|---|
| ✅ FAIT — Spec alignée rétroactivement | |
| ✅ FAIT — Installé sur 5 projets | |
| ✅ FAIT — Seuil 80% | |
| Documenter mocks dans README | À FAIRE |
Script test:all:coverage | À FAIRE — Merger coverage Jest+Vitest |
9. Enseignements clés¶
-
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.
-
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).
-
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.
-
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.
-
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.
-
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.