PD-19 — Rétrospective¶
1. Contexte¶
| Champ | Valeur |
|---|---|
| Story ID | PD-19 |
| Titre | CORS et Security Headers |
| Domaine | backend-core |
| Projet | backend |
| Date complétion | 2026-02-10 |
| Verdict | GO (Gate 8) |
2. Métriques¶
| Métrique | Valeur |
|---|---|
| Temps total | 18.5h (vs 14h estimé, +32%) |
| Itérations gates | 5 (G3: 2, G5: 2, G8: 1) |
| Tests contractuels | 61/61 PASS |
| Invariants couverts | 12/12 |
| Écarts totaux | 21 (ECT: 9, DIV: 6, AMB: 4, SEC: 2) |
Scores de convergence¶
| Gate | Score v1 | Score final | Delta |
|---|---|---|---|
| Gate 3 | 5.25/10 | 7.50/10 | +2.25 |
| Gate 5 | 7.75/10 | 8.50/10 | +0.75 |
| Gate 8 | 8.0/10 | 8.0/10 | 0 |
3. Learnings clés¶
-
Paramètres contractuels explicites : Les critères d'acceptation non mesurables (socle headers sans liste, CORS sans origines) sont les premières causes de rejet Gate 3.
-
Headers sur erreurs = res.on('finish') : Les security headers doivent être appliqués même sur les réponses d'erreur. Le pattern
res.on('finish')garantit cette couverture. -
Trust proxy = surface d'attaque : La résolution IP via X-Forwarded-For sans validation de la chaîne de confiance permet le bypass du rate limiting.
-
Faux positifs reviews LLM : Les faux positifs Gate 5 étaient causés par la lecture de résumés plutôt que des documents complets.
-
Rétention logs = config infra : La rétention de 90 jours n'est pas codée dans l'application mais dans ELK lifecycle.
4. Patterns applicables¶
Pattern existant : Fail-fast config sécurité¶
Cohérent avec PD-22, PD-240 : la configuration CORS/headers doit échouer au démarrage si invalide.
Nouveau pattern : res.on('finish') pour headers universels¶
Pour garantir les security headers même sur exceptions non catchées :
Nouveau pattern : Trust proxy + TRUSTED_PROXIES¶
Pour le rate limiting avec proxy : 1. Configurer app.set('trust proxy', trustProxyConfig) 2. Variable env TRUSTED_PROXIES avec liste explicite 3. Validation stricte de X-Forwarded-For
5. Signal CLAUDE.md¶
Priorité haute : Documenter le pattern Trust proxy.
### Trust proxy et rate limiting (2026-02-XX)
La résolution IP via X-Forwarded-For sans validation permet le bypass du rate limiting.
**Checklist obligatoire** :
1. Configurer `trust proxy` de manière restrictive (pas `true` global)
2. Variable `TRUSTED_PROXIES` avec liste explicite des IPs proxy
3. Validation que l'IP client vient bien de la chaîne de confiance
6. Conclusion¶
PD-19 est la story la plus documentée du batch avec des métriques complètes. Les 21 écarts identifiés ont permis d'améliorer significativement les prompts de spec et de review. Les patterns res.on('finish') et Trust proxy sont des contributions importantes pour les futures stories sécurité.
Rétrospective générée 2026-02-19 (Étape 10 batch backend-core)