PD-277 — Rétrospective
1. Résumé de la story
| Métrique | Valeur |
| Story | PD-277 — Anti-rejeu nonce et PKI certificate binding |
| Durée | ~3.5h (session unique) |
| Gate 3 | GO v2 (8.25/10) — 2 itérations |
| Gate 5 | GO v3 (8.75/10) — 3 itérations (convergence) |
| Gate 8 | GO v1 (9.125/10) — 1 itération |
| Tests | 174/174 legal-pre (coverage 92.89%) |
| Corrections sécurité | 2 (S-01 regex, S-02 TOCTOU) |
2. Patterns récurrents confirmés
P-01 — Review croisée ChatGPT détecte des vulnérabilités que les tests unitaires ne couvrent pas
- Fréquence : PD-277 (S-01 regex /i, S-02 includes TOCTOU)
- Impact : MAJEUR — 2 vulnérabilités corrigées avant Gate 8
- Action : Conserver la review sécurité ChatGPT comme phase obligatoire. La review adversariale est le principal filet de sécurité pour les patterns interdits.
P-02 — Gate 8 GO en v1 quand corrections intégrées dans l'acceptabilité
- Fréquence : PD-277 (v1 GO 9.125), PD-273 (v1 GO), PD-272 (v1 GO)
- Impact : Gain de temps — pas de boucle correction Gate 8
- Action : Maintenir le pattern "corriger avant d'assembler l'acceptabilité" plutôt que "documenter les écarts et corriger après Gate 8".
- Fréquence : PD-277 (UUID v4 lowercase ASCII contractualisé en v2 spec), PD-274 (enum format)
- Impact : La non-contractualisation en v1 a causé la boucle Gate 3 v1→v2
- Action : Template spec enrichi : section "Formats et contraintes" obligatoire dès v1.
P-04 — Sonar indisponible ne bloque pas le workflow si ESLint + TSC clean
- Fréquence : PD-277 (token Vault null)
- Impact : Dérogation de fait acceptée mais documentée. DIV-03 = -1.0 sur maintainability.
- Action : Ajouter un fallback sonar-scanner local si Vault inaccessible. Investiguer pourquoi le token Sonar est null.
3. Patterns nouveaux
N-01 — JSONB @> atomique élimine les forbidden patterns applicatifs
- Contexte :
usedNonces.includes(nonce) est un forbidden pattern (TOCTOU). Remplacé par NOT (used_nonces @> :nonceJson::jsonb) dans le WHERE de l'UPDATE. - Impact : Élimine la race condition au niveau DB sans lock explicite.
- Candidat CLAUDE.md : Oui — pattern réutilisable pour toute vérification d'unicité sur JSONB array.
N-02 — Regex UUID v4 sans flag /i pour lowercase strict
- Contexte : Le flag
i sur la regex UUID permettait un bypass de l'anti-rejeu par variation de casse. - Impact : Vulnérabilité de sécurité MAJEUR corrigée.
- Candidat CLAUDE.md : Oui — règle : "Toute regex de validation format DOIT être case-sensitive sauf justification explicite."
4. Améliorations de processus suggérées
| ID | Proposition | Cible | Priorité |
| A-01 | Ajouter section "Formats et contraintes" obligatoire dans le template spec v1 ✅ FAIT (2026-02-28) — Section ajoutée dans 1 Specification.md v1.6.0 → v1.7.0 | templates/prompts/1-specification.md | HAUTE Résolue |
| A-02 | Ajouter règle "regex case-sensitive par défaut" dans CLAUDE.md — Déjà couvert par A-01 (case-sensitivity contractualisée dans la spec via section "Formats et contraintes") | CLAUDE.md backend | MOYENNE N/A |
| A-03 | Ajouter règle "JSONB @> pour unicité array" dans CLAUDE.md — Écarté (pattern trop spécifique, couvert par les forbidden patterns dans la spec) | CLAUDE.md backend | MOYENNE N/A |
| A-04 | Investiguer token Sonar null dans Vault ✅ FAIT (2026-02-28) — Credentials à kv/data/ci/sonarqube, URL corrigée | Opérationnel | HAUTE Résolue |
| A-05 | Documenter le fallback sonar-scanner local (brew install) — Déjà couvert (procedures.md interdit la dérogation ESLint+tsc, token Vault corrigé par A-04) | CLAUDE.md governance | BASSE N/A |
5. Verdict de rétrospective
La story PD-277 s'est déroulée en une session continue avec un workflow fluide. Les 6 itérations de gate (2+3+1) montrent que la convergence s'améliore : Gate 8 GO en v1 grâce aux corrections intégrées en amont. Le principal enseignement est que la review croisée ChatGPT reste le mécanisme le plus efficace pour détecter les vulnérabilités de sécurité que les tests unitaires ne couvrent pas (regex /i, TOCTOU). Le pattern JSONB @> est désormais un invariant réutilisable pour toutes les vérifications d'unicité sur arrays JSONB dans le projet.