Rétrospective — PD-284¶
Résumé story¶
- Story : PD-284 — UX scellement instantané — bouton urgent, carte progression, détails techniques
- Domaine : b2c-mineurs (app mobile React Native)
- Date : 2026-03-13
- Durée : 5.4h (vs moyenne projet 6.6h, -18%)
- Gates : G3 GO (v3, score 8.13) | G5 GO (v2, score 8.75) | G8 RESERVE (v1, score 8.17)
Learnings de cette story¶
Depuis les gates¶
| Gate | Verdict | Score | Itérations | Tags | Note |
|---|---|---|---|---|---|
| G3 | GO | 8.13 | 3 | #spec, #state-machine, #branded-types | Spec initiale manquait branded types et SLA temporels — ajoutés en v2/v3 |
| G5 | GO | 8.75 | 2 | #plan, #code-contracts, #decomposition | Code contracts détaillés ont accéléré Phase 6b (agents bien cadrés) |
| G8 | RESERVE | 8.17 | 1 | #test-coverage, #sse-testing, #mobile | 3 MAJEUR tests infra absents, logique métier bien couverte |
Depuis le REX¶
- Branded types comme barrière compilateur — SealId, DocumentId empêchent inversions UUID à la compilation. Pattern reproductible pour tout UUID sémantiquement distinct.
- Cognitive complexity : extraction de FIELD_BUILDERS Record — Remplacer un switch/case par un Record
réduit la complexité cognitive de 26 à <15 sans perte de lisibilité. - Mutable mapped type pour Zustand —
{ -readonly [K in keyof State]: State[K] }permet set() interne tout en gardant l'interface readonly pour les consommateurs. - Tests infrastructure nécessitent planification dédiée — SSE client, orchestrateur et composants UI React Native absents car non planifiés comme tâches explicites dans la décomposition.
- tsconfig exclude patterns — Wildcard
**/screens/vault/**bloquait ESLint pour nouveaux fichiers. Remplacer par exclusions individuelles.
Patterns récurrents (domaine mobile/app)¶
Pattern 1 : Tests UI React Native systématiquement absents (5 stories)¶
Stories : PD-284, PD-262, PD-101, PD-174, PD-79 Fréquence : 5/22 stories mobile (23%) Impact : RESERVE en Gate 8 pour PD-284. Coverage sous seuil pour PD-79. Cause : Les tests de composants React Native nécessitent RNTL + mocks complexes (navigation, SecureStore, fetch). Ils sont systématiquement sous-estimés en effort. Recommandation : Ajouter un item obligatoire dans la décomposition (step 6a) : "T-N: Tests composants UI (RNTL)" avec estimation explicite ≥ 2h.
Pattern 2 : Modules infra (SSE, WebSocket, streaming) non testés (3 stories)¶
Stories : PD-284 (SSE), PD-101 (multipart upload streaming), PD-180 (webhooks outbox) Fréquence : 3/22 stories avec module réseau temps réel Impact : Tests manquants en Gate 8 à chaque fois. Cause : Le mocking de fetch streaming, EventSource ou ReadableStream est complexe et peu documenté dans l'écosystème React Native/Expo. Recommandation : Créer un helper de test réutilisable __mocks__/fetch-streaming.ts avec exemples pour SSE, multipart, et WebSocket.
Pattern 3 : Reviewers LLM sans visibilité composants UI (3 stories)¶
Stories : PD-284 (E-01/E-02 audit), PD-262 (50% faux positifs Swift), PD-86 (Swift/SwiftUI confusion) Fréquence : 3 stories Impact : Faux positifs systématiques dans reviews code et sécurité. Cause : Le script d'assemblage des prompts n'injecte pas les composants UI (.tsx) dans le contexte de review code, seulement les modules logiques (.ts). Recommandation : Modifier assemble-prompt.sh --type review-code pour inclure les fichiers src/components/**/*.tsx dans le scope d'injection.
Pattern 4 : Gate 3 converge en 3 itérations (alerte faible)¶
Stories : PD-284 (3 iter), PD-283 (3 iter), PD-80 (2 iter) Fréquence : 3 stories récentes du domaine b2c-mineurs Impact : Temps de convergence Gate 3 élevé mais sans blocage. Cause : Les specs initiales du domaine b2c-mineurs impliquent des machines à états complexes (scellement, export, upload) qui génèrent des écarts structurels. Recommandation : Pour les stories avec machine à états ≥ 5 états, pré-rédiger le diagramme de transitions dans le besoin (step 0) pour cadrer la spec dès le départ.
Recommandations¶
Priorité haute (≥ 5 stories ou pattern récurrent)¶
- R-01 : Ajouter item obligatoire "Tests composants UI (RNTL)" dans la checklist décomposition step 6a (Pattern 1)
- R-02 : Créer
src/__mocks__/fetch-streaming.tscomme helper réutilisable pour tests SSE/streaming (Pattern 2) - R-03 : Modifier
assemble-prompt.sh --type review-codepour incluresrc/components/**/*.tsx(Pattern 3)
Priorité normale¶
- R-04 : Pour stories avec FSM ≥ 5 états, inclure diagramme transitions dans le besoin step 0 (Pattern 4)
- R-05 : Documenter le pattern
{ -readonly [K in keyof State]: State[K] }pour Zustand dans les code contracts templates - R-06 : Enrichir la regex UUID client avec format canonique
8-4-4-4-12(finding S-01)
Signal CLAUDE.md¶
ProbatioVault-app/CLAUDE.md¶
Section suggérée : "Tests composants React Native"
## Tests composants React Native (RNTL)
Toute story avec composant UI React Native DOIT planifier une tâche de test dédiée
dans la décomposition (step 6a), avec estimation ≥ 2h. Les tests UI ne sont PAS
un add-on post-implémentation.
Helper de mocking streaming : `src/__mocks__/fetch-streaming.ts`
ProbatioVault-ia-governance/CLAUDE.md (ou rules/)¶
Section suggérée : "Review code — injection composants UI"
## Review code — injection composants UI
Le script assemble-prompt.sh --type review-code DOIT inclure les fichiers
`src/components/**/*.tsx` dans le scope d'injection pour éviter les faux positifs
systématiques sur les invariants couverts par les composants UI.
La mise à jour de CLAUDE.md reste à la discrétion du PO.