Aller au contenu

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)