PD-21 — Rétrospective¶
1. Contexte¶
| Champ | Valeur |
|---|---|
| Story ID | PD-21 |
| Titre | BullMQ Jobs System |
| Domaine | backend-core |
| Projet | backend |
| Date complétion | 2025-12-23 |
| Verdict | ACCEPTÉ (v2) |
2. Métriques¶
| Métrique | Valeur |
|---|---|
| Tests unitaires | ~50 |
| Couverture estimée | >85% |
| Itérations acceptabilité | 2 |
| Écarts bloquants | 1 (E-01) |
| Écarts majeurs | 1 (E-02) |
| Fichiers créés | 20+ |
3. Learnings clés¶
-
Queues contractuelles explicites : La distinction entre queues "core PD-21" et "hypothétiques futures PDs" aurait dû être plus claire dans la spec initiale.
-
Idempotence by design : L'invariant d'idempotence (I-7) aurait dû être explicite dès la v1, pas ajouté après audit.
-
Retries explicites via Prefect : Aucun retry implicite dans BullMQ (
attempts: 1). Les retries sont orchestrés par Prefect pour traçabilité complète. -
BaseProcessor abstrait : La méthode
getIdempotencyKey()abstraite force chaque processor à prendre une décision explicite sur l'idempotence.
4. Patterns applicables¶
Pattern existant : Redis Resilience¶
Les health checks hybrides (réactif via événements + proactif via /health) sont cohérents avec PD-30.
Réf : PD-30-retrospective.md
Nouveau pattern : Idempotence obligatoire BaseProcessor¶
Pour tout système avec effets irréversibles :
@Processor(QUEUE_NAME)
export class MyProcessor extends BaseProcessor<MyData> {
getIdempotencyKey(job: Job<JobData<MyData>>): string | null {
return job.data.payload.documentHash; // ou null si pas d'effet à protéger
}
}
Nouveau pattern : Queues contractuelles explicites¶
Les queues doivent être listées explicitement dans la spec, pas déduites des futures PDs.
5. Signal CLAUDE.md¶
Priorité haute : Documenter le pattern d'idempotence pour les jobs.
### Idempotence jobs — Pattern BaseProcessor (2026-02-XX)
Tout processor de job DOIT :
1. Hériter de `BaseProcessor`
2. Implémenter `getIdempotencyKey(job)` retournant une clé unique ou null
3. Utiliser `handleJob()` comme point d'entrée (pas `process()` directement)
Retourner `null` est une décision consciente = "pas d'effet irréversible à protéger".
6. Conclusion¶
PD-21 a livré une infrastructure robuste de jobs asynchrones conforme aux exigences probatoires NF Z42-013. Les écarts E-01 (queues manquantes) et E-02 (idempotence absente) ont conduit à une implémentation plus solide. Le pattern BaseProcessor avec idempotence obligatoire est une contribution majeure pour les futures stories.
Rétrospective générée 2026-02-19 (Étape 10 batch backend-core)