Gate : AMBIGUITY
Story : PD-180 — Webhooks événements utilisateur
Date : 2026-03-07
Itération : v1
1. Sources
- Review (P1 ChatGPT) : 13 écarts (4 BLOQ, 5 MAJ, 4 MIN)
- Confrontation (P2 Claude) : 5 divergences (3 BLOQ, 2 MIN) + 7 zones d'ombre
2. Écarts consolidés (dédupliqués)
BLOQUANTS (3)
| ID | Type | Description | Source |
| ECT-01 | Non-conformité | Rate limit : le plan prévoit un rejet 429 + checkAndIncrement avant création des intentions. La spec impose mise en attente en file BullMQ sans perte (CA-13). Le check est fait 1 fois par événement, pas par intention (N webhooks abonnés = N unités). | Review + Confrontation DIV-01/DIV-05 |
| ECT-02 | Non-conformité | Atomicité DB+BullMQ : le plan place l'enqueue BullMQ dans la transaction logique sans démontrer que le crash pré-commit ne laisse pas d'artefact persistant dans BullMQ. INV-14 exige rollback complet. | Review |
| ECT-03 | Incohérence | Replay : route /webhooks/:id/replay/:eventId scope le replay à un webhook spécifique. La spec v3 spécifie broadcast vers tous les webhooks ACTIVE abonnés au moment du replay. | Review + Confrontation DIV-02 |
MAJEURS (4)
| ID | Type | Description | Source |
| ECT-04 | Ambiguïté | Observabilité : le plan ne documente pas les points d'observation pour vérifier payload exact signé, headers signés, preuve de relecture DB par tentative. Tests TC-NOM-05, TC-SEC-02, TC-INV-15 non validables. | Review |
| ECT-05 | Incohérence | Code contracts : certains invariants (API BullMQ deprecated, Swagger, migration reversible) ne sont pas ancrés dans les invariants spec INV-XX. | Review |
| ECT-06 | Ambiguïté | ESM/CJS : absence de qualification des dépendances ESM-only et du runner adapté. | Review |
| ECT-07 | Ambiguïté | Transport tenantId : pas de spécification du mécanisme de propagation de orgId dans les événements EventEmitter2 entre modules. | Confrontation ZO-01 |
MINEURS (5)
| ID | Type | Description | Source |
| ECT-08 | Ambiguïté | Limite 4096 bytes metadata absente du plan et des code contracts. | Confrontation DIV-03 |
| ECT-09 | Ambiguïté | Section "Contraintes techniques" absente du plan. | Review |
| ECT-10 | Ambiguïté | Dépendances inter-PD sans statut DONE/TODO/STUB. | Review |
| ECT-11 | Ambiguïté | Framework de test (Jest vs Vitest) non documenté. | Review |
| ECT-12 | Ambiguïté | Variables CI nécessaires non listées. | Review |
3. Scoring par critère
| Critère | Écarts assignés | Score |
| feasibility | ECT-02 (BLOQ), ECT-06 (MAJ) | 10 - 2 - 1 = 7.0 |
| coverage | ECT-04 (MAJ), ECT-08 (MIN), ECT-09 (MIN) | 10 - 1 - 0.25 - 0.25 = 8.5 |
| risk_mitigation | ECT-01 (BLOQ), ECT-07 (MAJ), ECT-10 (MIN), ECT-11 (MIN), ECT-12 (MIN) | 10 - 2 - 1 - 0.25 - 0.25 - 0.25 = 6.25 |
| coherence | ECT-03 (BLOQ), ECT-05 (MAJ) | 10 - 2 - 1 = 7.0 |
Moyenne : (7.0 + 8.5 + 6.25 + 7.0) / 4 = 7.19
4. Verdict
- Moyenne 7.19 >= 7 : OK
- risk_mitigation 6.25 < 8 ET feasibility 7.0 < 8 ET coherence 7.0 < 8 → au moins un score < 8
- Mais risk_mitigation 6.25 >= 6 : OK (pas NON_CONFORME)
- Verdict : RESERVE