Rétrospective — PD-250
Résumé story
- Story : PD-250 — Job destruction définitive et bordereau
- Domaine : legal-compliance
- Date : 2026-02-25
- Durée totale : ~23.5h (estimation initiale 14h, +68%)
- Gates : G3 RESERVE (8.625/10, v4) | G5 RESERVE (7.875/10, v1) | G8 RESERVE (7.875/10, v1)
- Complexité : haute (16 INV, 16 CA, 8 ERR, conformité multi-standard ISO 14641 / NF Z42-013 / eIDAS / RGPD)
Learnings de cette story
Depuis les gates
| Gate | Verdict | Score | Itérations | Tags principaux | Note |
| G3 | RESERVE | 8.625 | 4 (ESCALADE v3→v4) | #destruction #worm #iso14641 | Clarity oscillante v1-v3 (3.0→3.0, delta=0). ESCALADE + correction Claude : +4.75 clarity en 1 iter |
| G5 | RESERVE | 7.875 | 1 | #destruction #bullmq #audit | Test ACID transactionnel nécessite intégration PostgreSQL réel. parentBatchId dans audit log |
| G8 | RESERVE | 7.875 | 1 | #destruction #fail-closed #ISO-14641 | 475 tests, 92.79% coverage. Assertions 403 triviales (INV-250-15), Sonar non exécuté |
| REX | GO | — | 1 | #learnings-as-invariants #escalade | 5 enseignements clés. ROI learnings-as-invariants : ~1.5 iter/invariant |
Depuis le REX
- Learnings-as-invariants : 3 invariants PD-55/PD-264 (BullMQ v5, noms de queue, atomicité DB/BullMQ) → 0 écart en 3 gates. ROI ~4.5 itérations évitées.
- ESCALADE comme accélérateur : Gate 3 v2/v3 stagnantes (delta=0). Correction directe Claude post-escalade converge en 1 iter vs 2+ iter ChatGPT.
- Preuve contractuelle guards : Vérifier mécanisme (guard existe) ≠ prouver contrat (HTTP 403 + empty body + audit trail).
- Tests intégration ACID obligatoires : Mocks ne prouvent pas non-perte, monotonie, complétude audit après crash recovery.
- Machine à états formelle : Transitions autorisées ET interdites doivent être explicites (MAJ-28 RECONCILIATION_FAILED → * ajouté tardivement).
Patterns récurrents (domaine legal-compliance)
Stories analysées : PD-81, PD-244, PD-264, PD-250 (25 learnings)
| Pattern | Stories | Impact | Recommandation |
| SLA temporels non contractualisés | PD-81 (v1=4.25/10), PD-264, PD-250 | Gate 3 ×3 itérations | Chaque transition d'état temporelle DOIT avoir SLA min/max/default dans la spec |
| Atomicité multi-composant ambiguë | PD-264 (3 iter), PD-250 | Gate ⅗ confusion sync vs async | Clarifier DB transaction synchrone vs post-commit (BullMQ/Merkle/append-only) |
| Migration DDL sous-spécifiée | PD-264 (2 iter), PD-250 | Gate 3 rejets | Contractualiser ALTER TYPE + backfill + stratégie zero-downtime dans la spec |
| Fail-closed non systématique | PD-81, PD-250 | Gate 8 écarts SEC | Pattern : audit AVANT action, exception si audit échoue, 403+empty body+trail |
| Stubs TSA/HSM/S3 récurrents | PD-81, PD-63, PD-250 | MINEUR récurrent | Stubs acceptables si fail-closed + TODO tracés, mais intégration planifiée |
Patterns récurrents (cross-domain)
| Tag | Stories | Alerte |
#crypto | 21 stories | Forte — domaine le plus complexe, clarity faible en v1 |
#security | 14 stories | Forte — faux positifs LLM récurrents, corrections post-Gate 8 |
#backend | 20+ stories | Structurel — majorité des stories backend |
#testing | 12 stories | Forte — assertions faibles, mocks insuffisants pour ACID |
#plan | 11 stories | Moyenne — sections résilience/traçabilité manquantes |
#code-contracts | 9 stories | Moyenne — amélioration +1.374 score avec contracts YAML |
#worm | 7 stories | Forte — Object Lock COMPLIANCE irréversible, CRR config |
#audit | 6 stories | Moyenne — audit transactionnel ACID pattern établi |
#sonar | 6 stories | Forte — Sonar local non exécutable récurrent |
#fail-closed | 5 stories | Moyenne — pattern établi mais non systématique |
Patterns bloquants identifiés
| Pattern | Fréquence | Impact |
| Gate 3 v1 structurellement faible | PD-250 (5.75→8.625), PD-81 (4.25→9.25), PD-86 (4.875→8.5) | 3-4 itérations récurrentes sur specs normatives/crypto |
| Sonar local non exécutable | PD-250, PD-55, PD-107, PD-31, PD-44, PD-82, PD-248, PD-177 (8 stories) | Phase 1.5 bloquante contournée → corrections post-merge |
| Assertions tests triviales | PD-250 (DIV-02), PD-63 (similar pattern) | INV non prouvés contractuellement |
Recommandations
Priorité haute (>= 5 stories ou pattern bloquant)
Priorité normale
Signal CLAUDE.md
Les améliorations haute priorité des templates ont déjà été appliquées par le subprocess REX :
| Fichier modifié | Changement | Version |
templates/prompts/1 Specification.md | Checklist machine à états (transitions interdites) | 1.4.0 → 1.5.0 |
templates/prompts/7a Review Code.md | Axe preuve contractuelle guards d'accès | mise à jour |
templates/prompts/3 Spécification – Review.md | Scoring clarity renforcé (ambiguïtés terminologiques = contradictions) | 1.0.0 → 1.1.0 |
Sections CLAUDE.md candidates pour révision humaine :
- Section "Gates PMO > Convergence" : Ajouter règle
delta=0 sur 2 itérations consécutives → ESCALADE automatique (économie estimée : 1 itération/story normative) - Section "Étape 7 — Acceptabilité" : Formaliser la procédure de dérogation Sonar (ESLint+tsc comme substitution) ou rendre l'installation sonar-scanner obligatoire
- Section "Étape 6 — Agents" : Ajouter règle agent-qa :
@Roles() → test DOIT asserter HTTP status exact + empty body + audit trail (pattern minimal non négociable)
Invariants candidats (learnings-as-invariants)
| ID candidat | Source | Formulation | Stories potentiellement impactées |
| INV-XXX-GUARD-PROOF | PD-250 DIV-02, PD-63 | Tout endpoint @Roles() DOIT avoir un test assertant (1) HTTP status exact, (2) absence de contenu, (3) appel audit trail | Toutes stories avec endpoints protégés |
| INV-XXX-STATE-FORBIDDEN | PD-250 MAJ-28 | Tout état terminal d'une machine à états DOIT avoir la mention explicite → * : INTERDITE | Stories avec machine à états formelle |
| INV-XXX-ACID-INTEGRATION | PD-250 BLQ-01 | Tout invariant impliquant des propriétés ACID transactionnelles DOIT être couvert par un test d'intégration PostgreSQL réel (pas de mock) | Stories avec audit probatoire, transactions |