PD-21 — Acceptabilité¶
Objectif¶
Vérifier que l’implémentation est conforme à la spécification, respecte l’ensemble des invariants ProbatioVault et ne présente aucune incohérence ou oubli critique.
Périmètre de vérification¶
La revue d’acceptabilité vérifie explicitement :
- la conformité stricte à la spécification fonctionnelle
- le respect de tous les invariants applicables
- la couverture des scénarios de test définis
- l’absence d’incohérences, oublis ou régressions
Écarts identifiés¶
Chaque écart constaté doit être documenté et classé selon sa gravité.
Classification des écarts¶
| Niveau | Définition |
|---|---|
| BLOQUANT | Violation d’un invariant, faille de sécurité, non-conformité majeure à la spec |
| MAJEUR | Fonction incomplète, comportement non conforme mais sans rupture de sécurité |
| MINEUR | Détail, dette acceptable, amélioration non critique |
Détail des écarts¶
| ID | Description | Référence | Gravité | Statut |
|---|---|---|---|---|
| E-01 | Invariant des trois queues non respecté : seule la queue DEFAULT est implémentée (JobType DEFAULT), les queues backup/export/blockchain requises par la spec ne sont ni créées ni initialisées. | Spec §2.1 (queues backup/export/blockchain), §4.1-4.2 ; Plan §1.3 | BLOQUANT | ✅ RÉSOLU |
| E-02 | Exécution "au plus une fois" ambiguë : attempts=1 mais le mécanisme de retry via Prefect crée de nouveaux jobs sans contrainte d'idempotence ni déduplication effective (idempotencyKey optionnelle, non vérifiée). | Spec §4.3 (exécuté au plus une fois ou échec explicite), §5.⅖.3 ; Plan §2.4 | MAJEUR | ✅ RÉSOLU |
Résolutions appliquées (2025-12-23)¶
E-01 - Queues contractuelles :
- Ajout des queues
BACKUP,EXPORT,BLOCKCHAINdansqueue-names.ts - Mise à jour du mapping
job-type-queue-map.ts: les job types métiers sont mappés vers leurs queues respectives - Enregistrement des 4 queues dans
jobs.module.tsviaBullModule.registerQueue()
E-02 - Idempotence obligatoire (Option B) :
- Ajout de la méthode abstraite
getIdempotencyKey(job): string | nulldansBaseProcessor - Vérification d'idempotence OBLIGATOIRE dans
handleJob()AVANTmarkRunning() - Enregistrement automatique de l'effet après succès via
recordEffect() - Chaque processor DOIT implémenter
getIdempotencyKey()(contrat TypeScript) - Tests E-02 ajoutés pour valider le comportement
[2025-12-23] — Suivi E-01¶
- Statut précédent : BLOQUANT
- Statut actuel : RÉSOLU
- Justification factuelle :
QUEUE_NAMESdéclare désormaisBACKUP,EXPORT,BLOCKCHAINen plus deDEFAULT.- Mapping strict JobType → Queue dans
job-type-queue-map.ts(DOCUMENT_ARCHIVE→BACKUP, BLOCKCHAIN_→BLOCKCHAIN, EXPORT_→EXPORT). - Enregistrement des 4 queues contractuelles dans
jobs.module.tsviaBullModule.registerQueue(...). - Référence vérification :
- src/modules/jobs/constants/queue-names.ts
- src/modules/jobs/constants/job-type-queue-map.ts
- src/modules/jobs/jobs.module.ts
[2025-12-23] — Suivi E-02¶
- Statut précédent : MAJEUR
- Statut actuel : RÉSOLU
- Justification factuelle :
- Idempotence imposée :
BaseProcessorrendgetIdempotencyKeyabstraite et appellecheckIdempotency/recordEffectdanshandleJob()avant tout effet irréversible ; jobs déjà traités sont marqués SKIPPED et journalisés. - Tests processors/services couvrent l’idempotence et les reprises.
- Référence vérification :
- src/modules/jobs/processors/base.processor.ts
- src/modules/jobs/jobs.service.ts
- Tests : src/modules/jobs/processors/.spec.ts ; src/modules/jobs/services/.spec.ts
Conclusion d'acceptabilité¶
✅ ACCEPTÉ
Tous les écarts identifiés ont été corrigés :
- E-01 (BLOQUANT) : Les 4 queues contractuelles sont maintenant implémentées et enregistrées
- E-02 (MAJEUR) : L'idempotence est garantie par contrat via la méthode abstraite
getIdempotencyKey()
Historique des verdicts¶
| Date | Verdict | Version | Commentaire |
|---|---|---|---|
| 2025-12-23 | ✅ ACCEPTÉ | v2 | E-01 et E-02 résolus : queues contractuelles + idempotence obligatoire |
| 2025-12-23 | ⛔ REFUSÉ | v1 | E-01 BLOQUANT (queues absentes), E-02 MAJEUR (unicité non garantie) |