Story : PD-180 — Webhooks événements utilisateur
Date : 2026-03-07
Itération : v3 (dernière itération — plafond 3)
1. Résolution des écarts v2
| ECT v2 | Statut v3 |
| ECT-16 (BLOQ) HMAC secret brut vs hash | RÉSOLU — clé HMAC = SHA-256(S), obligation partenaire documentée |
| ECT-17 (BLOQ) Schéma payload strict | RÉSOLU — 3 variantes (documentaire, device.revoked, ping) |
| ECT-18 (MAJ) Timeout HTTP | RÉSOLU — 5 secondes contractualisé |
| ECT-19 (MAJ) Références ECT-XX dans tests | RÉSOLU — toutes supprimées |
| ECT-20 (MAJ) Critères replay | RÉSOLU — DELIVERED/FAILED, <30j, même org |
| ECT-21 (MAJ) Attributs Update | RÉSOLU — target_url, event_types[], état listés |
| ECT-22 (MAJ) Dérivation clé signature | RÉSOLU — signing_key = secret_sha256, pas de dérivation |
| ECT-23 (MIN) Unité rate limit | RÉSOLU — intentions de livraison, N webhooks = N unités |
| ECT-24 (MIN) JSON.stringify fragile | RÉSOLU — construction programmatique immédiate avant sérialisation |
| ECT-25 (MIN) Périmètre purge | RÉSOLU — tentatives purgées, intentions conservées |
| ECT-26 (MIN) Secret irrécovrable | RÉSOLU — rotation comme seul recours, by design |
2. Résolution des écarts review v3 (Claude)
| ID review | Statut v3 |
| E-01 (BLOQ) Secret brut vs masque dans Flux A | RÉSOLU — Flux A étape 4 corrigé : retourne secret brut une seule fois, GET/LIST retournent masque |
| E-02 (MAJ) Unicité webhook | RÉSOLU — explicité : pas de contrainte d'unicité |
| E-03 (MAJ) Ping/replay rate limit | RÉSOLU — ping et replay soumis au rate limit CA-13 |
| E-04 (MAJ) Cible du replay | RÉSOLU — webhooks ACTIVE abonnés au moment du replay |
| E-05 (MAJ) ERR-12 responsabilité | RÉSOLU — reformulé : données source internes, état FAILED + log |
| E-06 (MAJ) TOCTOU DNS | RÉSOLU — IP pinning spécifié dans INV-15 |
3. Écarts résiduels v3
BLOQUANTS (0)
Aucun.
MAJEURS (0)
Aucun.
MINEURS (5)
| ID | Type | Description | Source |
| RES-01 | Ambiguïté | data.metadata accepte des propriétés arbitraires — aucune contrainte schématique interne. Risque théorique de fuite via metadata. | Review v3 E-07 |
| RES-02 | Incohérence Spec↔Tests | TC-NOM-10 ne teste pas le cas N>1 webhooks × 1 événement (multiplication des intentions). | Review v3 E-09 |
| RES-03 | Hypothèse | TOCTOU secret rotation : fenêtre de concurrence théorique entre lecture DB et envoi HTTP. Impact limité (retry corrige). | Review v3 E-10 |
| RES-04 | Ambiguïté | event_types[] vide autorisé ou non à la mise à jour — comportement non spécifié. | Review v3 E-11 |
| RES-05 | Ambiguïté | event_types[] à la création : minimum 1 obligatoire non spécifié explicitement. | Déduction E-11 |
4. Scoring par critère
| Critère | Écarts assignés | Score |
| completeness | RES-04 (MIN), RES-05 (MIN) | 10 - 0.5 = 9.5 |
| testability | RES-02 (MIN) | 10 - 0.25 = 9.75 |
| clarity | RES-01 (MIN) | 10 - 0.25 = 9.75 |
| traceability | RES-03 (MIN) | 10 - 0.25 = 9.75 |
Moyenne : (9.5 + 9.75 + 9.75 + 9.75) / 4 = 9.69
5. Convergence
- v1 mean: 6.0
- v2 mean: 7.5
- v3 mean: 9.69
- Delta v2→v3: +2.19 (amélioration majeure)
6. Verdict
- Moyenne 9.69 >= 7 : OK
- Tous scores >= 8 : OK (9.5, 9.75, 9.75, 9.75)
- Verdict : GO