PD-79 — Retour d'Expérience (REX)¶
Metadata¶
| Champ | Valeur |
|---|---|
| Story ID | PD-79 |
| Titre | Configurer catégorie B2C_EVIDENCE_MINOR dans PD-60 |
| Epic | PD-185 (B2C-MINEURS) |
| Projet | ProbatioVault-backend |
| Domaine | b2c-mineurs |
| Date | 2026-02-16 |
| Orchestrateur | Claude |
1. Résumé de la story¶
PD-79 configure une catégorie documentaire B2C_EVIDENCE_MINOR dans le moteur probatoire existant (PD-60), permettant de déposer des preuves numériques sensibles (images, audio, vidéo) avec validation de format MIME, taille limitée à 100 Mo, et scellement immédiat (< 1s).
Décision architecturale clé : Réutilisation complète de PD-60 avec une nouvelle catégorie déclarative. Pas de nouveau moteur probatoire, pas de régime juridique différent.
2. Métriques de workflow¶
| Métrique | Valeur |
|---|---|
| Durée totale | ~8 heures |
| Nombre d'étapes | 10 (0-9) |
| Gates traversées | 3 (Gate 3, 5, 8) |
| Itérations de gate | 1 par gate (GO direct) |
Scores des gates¶
| Gate | Type | Score | Verdict |
|---|---|---|---|
| 3 | CONFORMITY_CHECK | 8.50/10 | GO |
| 5 | AMBIGUITY | 8.13/10 | GO |
| 8 | CLOSURE | 7.88/10 | GO |
3. Écarts identifiés et résolus¶
Gate 3 (Spécification)¶
| ID | Type | Sévérité | Statut |
|---|---|---|---|
| ECT-79-01 | Traceability | MINEUR | FAUX_POSITIF |
| ECT-79-02 | Clarity | MINEUR | FAUX_POSITIF |
Learning : La matrice de traçabilité était présente mais non explicitement référencée dans la review initiale.
Gate 5 (Plan)¶
| ID | Type | Sévérité | Statut |
|---|---|---|---|
| AMB-79-01 | Ambiguity | MINEUR | CLARIFIE |
| AMB-79-02 | Ambiguity | - | FAUX_POSITIF |
| AMB-79-03 | Gap | MINEUR | REFERENCE_MANQUANTE |
| AMB-79-04 | Gap | MINEUR | ACCEPTE |
| AMB-79-05 | Risk | - | FAUX_POSITIF |
| AMB-79-06 | Ambiguity | MINEUR | CLARIFIE |
Learning : La stratégie de double contrôle (middleware + service) était intentionnelle (defense in depth) mais perçue comme redondance.
Gate 8 (Closure)¶
| ID | Type | Sévérité | Statut |
|---|---|---|---|
| ECT-79-G8-02 | Test Coverage | MINEUR | ACCEPTED |
| ECT-79-G8-03 | Performance | MINEUR | ACCEPTED |
| ECT-79-G8-05 | Load Testing | MINEUR | ACCEPTED |
Learning : Contrainte ESM du module file-type a réduit les tests d'intégration HTTP (5/16). Compensé par tests unitaires et sécurité (43 tests).
4. Couverture finale¶
| Type | Requis | Réel | Statut |
|---|---|---|---|
| Fonctionnalités (F-79) | 5 | 5 | 100% |
| Invariants (INV-79) | 6 | 6 | 100% |
| Critères d'acceptation (CA-79) | 8 | 8 | 100% |
| Codes d'erreur (ERR-79) | 7 | 7 | 100% |
Tests¶
| Type | Nombre |
|---|---|
| Unitaires | 24 |
| Intégration | 5 |
| Sécurité | 19 |
| Total | 48 |
Coverage code¶
| Métrique | Valeur |
|---|---|
| Statements | 100% |
| Branches | 92.85% |
| Functions | 100% |
| Lines | 100% |
5. Artefacts produits¶
| Artefact | Chemin |
|---|---|
| Besoin | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-besoin.md |
| Spécification | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-specification.md |
| Tests | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-tests.md |
| Plan | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-plan.md |
| Code contracts | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-code-contracts.yaml |
| Acceptabilité | docs/epics/b2c-mineurs/PD-79-evidence-upload/PD-79-acceptability.md |
Code produit¶
| Fichier | Description |
|---|---|
src/modules/documents/entities/document-category-config.entity.ts | Entité TypeORM |
src/modules/documents/services/category-config.service.ts | Service de résolution |
src/database/migrations/1739000000000-AddCategoryConfig.ts | Migration + seed |
src/modules/documents/dto/create-deposit.dto.ts | Extension DTO |
src/modules/documents/controllers/deposit.controller.ts | Intégration controller |
6. Learnings et recommandations¶
Ce qui a bien fonctionné¶
-
Décision architecturale précoce : Réutiliser PD-60 au lieu de créer un nouveau moteur a accéléré le développement.
-
Gates GO direct : Les 3 gates ont passé en une seule itération grâce à une spécification complète dès l'étape 1.
-
Validation MIME robuste : Analyse des magic bytes (4100 premiers octets) au lieu de se fier à l'extension.
-
Tests de sécurité extensifs : 19 tests de sécurité couvrant les attaques par fichiers déguisés, timing attacks, etc.
Points d'amélioration¶
-
Contrainte ESM file-type : Le module
file-typeen ESM pur a compliqué l'intégration Jest. Solution adoptée : import dynamique + mocking. -
Cache local non distribué : Le cache TTL 60s est local à chaque instance. Acceptable pour configs quasi-statiques mais à surveiller en horizontal scaling.
-
Coverage branches entités : Les décorateurs TypeORM génèrent des branches non couvertes. Le coverage global du projet a nécessité des tests additionnels dans d'autres fichiers.
Patterns réutilisables¶
| Pattern | Description | Réutilisabilité |
|---|---|---|
| Catégorie déclarative | Extension de fonctionnalité via configuration DB | Haute |
| MIME magic bytes | Validation sécurisée du type de fichier | Haute |
| Cache TTL simple | Cache Map avec expiration timestamp | Moyenne |
| Exceptions métier typées | ERR-XX-YYY avec codes explicites | Haute |
7. Actions post-release¶
| Action | Responsable | Deadline |
|---|---|---|
| Exécuter tests e2e HTTP en Docker | QA | Pré-release |
| Valider p95 <= 1s en charge | QA | Pré-release |
| Documenter API dans OpenAPI | Dev | Sprint+1 |
8. Conclusion¶
PD-79 est une story réussie avec : - 3 gates GO en première itération - 100% de couverture fonctionnelle - 48 tests passants - Architecture propre et extensible
Le positionnement stratégique de ProbatioVault comme infrastructure neutre de preuve a été renforcé par cette implémentation déclarative.
Validation¶
| Critère | Statut |
|---|---|
| Pipeline GitLab | ✅ SUCCESS (94.50% coverage) |
| Sonar Quality Gate | ✅ PASSED |
| Merge sur dev | ✅ Commit a16e785 |
| REX complété | ✅ 2026-02-16 |