Aller au contenu

PD-23 — Rétrospective

1. Contexte

Champ Valeur
Story ID PD-23
Titre Inscription utilisateur Zero-Knowledge (SRP-6a)
Domaine auth-identity
Projet backend
Date complétion 2025-12-27
Verdict ACCEPTÉ

2. Métriques

Métrique Valeur
Passes de revue 3
Écarts BLOQUANTS 2 (E-01, E-02)
Écarts MAJEURS 3 (E-03, E-04, E-05)
Écarts MINEURS 2 (E-06, E-07)
Couverture branches 80.06%

3. Learnings clés

  • Pattern Outbox atomique : L'insertion dans email_outbox transactionnelle avec la création de l'utilisateur garantit l'atomicité sans perdre de données en cas d'échec SMTP.

  • TODO = dette = ticket : Les commentaires // TODO sans ticket associé ont causé les écarts E-01 et E-05. Tout TODO doit référencer un ticket Jira.

  • Stockage distribué par défaut : Le rate limiting en mémoire a fonctionné en développement mais était incompatible avec la production multi-instances.

  • Race condition UNIQUE : Le cas de course (deux inscriptions simultanées même email) doit être géré via rattrapage du code PostgreSQL 23505.

4. Patterns applicables

Pattern existant : Anti-énumération multi-couches

  • Réponse HTTP 200 identique quel que soit l'état de l'email
  • Timing mitigation (délai aléatoire 50-150ms)
  • Gestion des violations UNIQUE PostgreSQL

Nouveau pattern : Pattern Outbox pour atomicité

Pour tout flux asynchrone critique (email, notification) :

await this.dataSource.transaction(async (manager) => {
  await manager.save(User, user);
  await manager.save(EmailOutbox, { to: email, template: 'validation', token });
});
// Worker séparé pour l'envoi réel

5. Signal CLAUDE.md

Priorité haute : Documenter le pattern Outbox.

### Pattern Outbox — Flux asynchrones atomiques (2026-02-XX)

Pour tout effet de bord asynchrone (email, webhook, notification) :
1. Insérer dans une table `*_outbox` dans la même transaction que les données métier
2. Worker séparé pour consommer et envoyer
3. Retry automatique en cas d'échec envoi

Évite la perte de données si le service externe est indisponible.

6. Conclusion

PD-23 a nécessité 3 itérations de revue mais a établi des patterns critiques pour l'inscription ZK-SRP. Les principaux learnings (Outbox, TODO=ticket, stockage Redis) sont applicables à toutes les stories auth-identity. L'architecture SRP-6a garantit que le mot de passe n'est jamais transmis au serveur.


Rétrospective générée 2026-02-19 (Étape 10 batch auth-identity)