Aller au contenu

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

  1. 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.
  2. 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.
  3. Preuve contractuelle guards : Vérifier mécanisme (guard existe) ≠ prouver contrat (HTTP 403 + empty body + audit trail).
  4. Tests intégration ACID obligatoires : Mocks ne prouvent pas non-perte, monotonie, complétude audit après crash recovery.
  5. Machine à états formelle : Transitions autorisées ET interdites doivent être explicites (MAJ-28 RECONCILIATION_FAILED → * ajouté tardivement).

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)

Tags haute fréquence (>= 5 stories distinctes)

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)

  • Installer sonar-scanner CLI natif : 8 stories avec Sonar local contourné. npx sonar-scanner ou scan via API REST GitLab. Élimine dérogations Phase 1.5 et corrections post-Gate 8.
  • Renforcer template spec (machine à états) : Déjà appliqué (REX PD-250 §10.1 → 1 Specification.md v1.5.0). Checklist transitions autorisées + interdites obligatoire.
  • Renforcer template review code (preuve guards) : Déjà appliqué (REX PD-250 §10.1 → 7a Review Code.md). Axe obligatoire HTTP status + audit trail.
  • Gate 3 seuil d'escalade auto à delta=0 : Quand 2 itérations consécutives ont le même score (delta=0), déclencher ESCALADE automatiquement. PD-250 et PD-81 auraient économisé 1 itération chacune.

Priorité normale

  • Template spec : section "Transitions inverses" : Pattern récurrent PD-84 — les downgrade/rollback sont un angle mort des specs ChatGPT.
  • Backfill migration : checklist "sources de vérité" : Pour colonnes booléennes dérivées d'état historique, vérifier DB courante + audit log + event store.
  • Budget temps stories normatives : Prévoir 3-4h Gate 3 minimum pour conformité multi-standard (ISO/eIDAS/RGPD). PD-250 : 4h vs 1h estimé.

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 :

  1. 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)
  2. Section "Étape 7 — Acceptabilité" : Formaliser la procédure de dérogation Sonar (ESLint+tsc comme substitution) ou rendre l'installation sonar-scanner obligatoire
  3. 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