Aller au contenu

PD-40 — Rétrospective

1. Contexte

Champ Valeur
Story ID PD-40
Titre Rotation de clés HSM et re-signature
Domaine crypto-proof
Projet backend
Date complétion 2026-01-05
Verdict ACCEPTÉ

2. Métriques

Métrique Valeur
Suites Jest/Vitest 144
Tests totaux 2551 + 92 contractuels
Couverture branches ~80%
Services créés 6
Invariants couverts 10/10
Critères d'acceptation 7/7

3. Learnings clés

  • Modèle append-only simplifie la gestion d'erreurs : Utiliser des états de signature (CANDIDATE/ACTIVE) plutôt que des suppressions rend le rollback trivial — il n'y a pas de rollback, juste une absence de promotion.

  • Invariants numérotés facilitent la traçabilité : Chaque INV-* a un test TC-INV-* correspondant. Cette correspondance 1:1 rend la revue d'acceptabilité mécanique.

  • Tests purs préférables pour CI : Convertir les tests d'intégration (avec DB) en tests unitaires purs accélère l'exécution CI de ~10x et élimine les problèmes de concurrence.

  • Canonicalisation RFC 8785 essentielle : Sans canonicalisation déterministe, le hash du payload varie selon l'ordre des clés JSON, rendant les signatures non reproductibles.

  • Documentation aspirationnelle vs factuelle : Marquer des tests comme PASS avant implémentation crée une fausse impression de complétude. Distinguer "à implémenter" vs "implémenté".

4. Patterns applicables

Pattern existant : Canonicalisation RFC 8785

import { canonicalize } from 'canonicalize';
const canonical = canonicalize(eventData);
const hash = crypto.createHash('sha3-256').update(canonical).digest();

Nouveau pattern : États de signature append-only

enum SignatureState {
  CANDIDATE = 'CANDIDATE',  // Re-signé, pas encore promu
  ACTIVE = 'ACTIVE',        // Signature de référence
  SUPERSEDED = 'SUPERSEDED', // Remplacée par nouvelle rotation
}

// Promotion atomique
await queryRunner.manager.update(SignatureEntry,
  { rotationId, state: SignatureState.CANDIDATE },
  { state: SignatureState.ACTIVE }
);

Nouveau pattern : Unicité clé active PostgreSQL

CREATE UNIQUE INDEX idx_unique_active_key
ON hsm_keys (status)
WHERE status = 'ACTIVE';

5. Signal CLAUDE.md

Priorité moyenne : Template de test avec statut factuel.

### Matrice de Tests — Statut factuel (2026-02-XX)

Dans PD-XX-tests.md, utiliser des statuts explicites :

| Test ID | Description | Statut | Date vérification |
|---------|-------------|--------|-------------------|
| TC-01 | ... | À IMPLÉMENTER | - |
| TC-02 | ... | IMPLÉMENTÉ | 2026-01-05 |
| TC-03 | ... | PASS (CI) | 2026-01-05 |

**NE JAMAIS marquer PASS avant exécution réelle.**

6. Conclusion

PD-40 a livré la rotation de clés HSM avec re-signature append-only et promotion atomique. Les 4 écarts (E-01 à E-04) concernaient des tests contractuels manquants, illustrant l'importance de distinguer documentation aspirationnelle et factuelle. Le pattern append-only avec états de signature est désormais standard pour les opérations probatoires.


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