Aller au contenu

Rétrospective — PD-47

Résumé story

  • Story : PD-47 — Créer service backup incrémental PostgreSQL
  • Domaine : storage
  • Projet : infra
  • Date : 2026-03-03
  • Gates : G3 GO (v2, 9.06/10) | G5 RESERVE (v2, 8.19/10) | G8 GO (v1, 8.5/10)
  • Temps total : 13.4h | Itérations : 5 | Écarts : 38

Learnings de cette story

Depuis les gates

Gate Verdict Score Iter Tags Note
G3 GO 9.06/10 v2 #backup, #postgresql, #specification NON_CONFORME v1 (6.0) → 18 corrections spec (ECT dominant)
G5 RESERVE 8.19/10 v2 reconciliation, state-machine, crash-recovery NON_CONFORME v1 (5.5) → 16 corrections plan, coverage=7.5
G8 GO 8.5/10 v1 #postgresql, #backup, #vault-transit, #aes-256-gcm 4 réserves mineures toutes mitigées, 0 BLOQUANT

Depuis le REX

  1. Envelope encryption fail-closed : Pas de fallback local quand Vault Transit est la seule source de clés — un fallback viole INV-47-03 et INV-47-09
  2. Journal append-only try/finally : Wrapper l'exécution complète pour garantir l'écriture d'au moins un événement même en échec précoce
  3. Watchdog découplé via queue BullMQ : Le watchdog produit un job dans la queue, un consommateur séparé injecte l'orchestrateur — indépendance réelle
  4. Hash sur clair compressé AVANT chiffrement : Pour vérification intégrité bout-en-bout, hash SHA3-256 sur clair compressé, pas sur ciphertext ni clair non compressé
  5. Double NON_CONFORME v1 = complexité conceptuelle : Pattern fiable (4ème occurrence) — corrections massives mais convergence forte

Patterns récurrents (domaine storage + global)

Tags ≥ 5 stories (alertes fortes)

Tag Stories Impact PD-47
state-machine 7 stories BackupStateService FSM explicite — 16ème occurrence pattern
coverage 5 stories 90.39% mais 2 fichiers sous-couverts (encryption 67%, relaunch 0%)
storage 5 stories Domaine principal — learnings PD-5, PD-264, PD-8 injectés
postgresql 7 stories pg_dump, pg_basebackup, PITR, WAL — pattern maîtrisé

Patterns bloquants (NON_CONFORME récurrent)

Pattern Occurrences Gates Impact
Format non contractualisé → ECT dominant Gate 3 17 stories G3 NON_CONFORME v1 systématique quand spec v1 manque formats/bornes
Reconciliation périmètre incomplet PD-47 + PD-264 G5 Divergence spec vs code-contracts sur couverture états non-terminaux

Axes fragiles (score < 7.5 récurrent)

Axe Gate Score PD-47 Commentaire
coverage (G5) 5 7.5 Seul score < 8.0 — réconciliation incomplète dans le plan initial

Recommandations

Priorité haute (≥ 5 stories ou NON_CONFORME récurrent)

  • R-01 : Ajouter dans templates/prompts/7c Review Security.md la détection du type de module (HTTP controller / Cron / BullMQ worker) pour désactiver les critères auth/authz non pertinents. 14 stories avec faux positifs LLM auth/authz.
  • R-02 : Ajouter dans templates/prompts/1 Specification.md une checklist obligatoire pour stories infra/backup (RPO, RTO, chiffrement, journal append-only, watchdog). 17 stories avec ECT dominant en Gate 3 v1.
  • R-03 : Corriger l'infrastructure Sonar (Elasticsearch indexing) — le CE task FAILED rend la Phase 1.5 non fiable. Bloquant pour toutes les stories futures.

Priorité normale

  • R-04 : Pré-générer les interfaces TypeScript partagées avant de lancer les agents en parallèle (step 6b) — 6 erreurs TS post-synthèse sur PD-47 dues à des types incompatibles entre agents
  • R-05 : Exiger la levée des hypothèses techniques AVANT Gate 5 — H-TECH-01 (pg_receivewal OVH) aurait dû être testée entre step 4 et step 5
  • R-06 : Détecter les stories cross-repo dès l'étape 0 et signaler la complexité de coordination inter-repo dans le besoin
  • R-07 : Ajouter permission kms:EnableKeyRotation + kms:ScheduleKeyDeletion au user terraform probatiovault-storage-admin — pipeline infra bloqué

Signal CLAUDE.md

Section .claude/rules/learnings.md — ajouts suggérés

  1. Module sans endpoint HTTP → filtrer critères sécurité auth/authz :

    Pour les modules exécutés exclusivement via Cron/BullMQ (pas de contrôleur HTTP), les critères auth/authz de la review sécurité (7c) doivent être désactivés. Signal project_type: cron|bullmq|api dans le prompt.

  2. Interfaces TypeScript partagées avant agents parallèles :

    Pour stories avec ≥ 10 composants générés par agents parallèles, pré-générer les types/interfaces partagés en phase 6a (décomposition) avant de lancer les agents en phase 6b. Réduit les erreurs TypeScript post-synthèse.

  3. Pipeline infra : permissions KMS admin requises :

    Le user terraform probatiovault-storage-admin nécessite kms:EnableKeyRotation et kms:ScheduleKeyDeletion pour gérer les clés KMS. Sans ces permissions, le pipeline infra échoue sur les changements de politique de rotation.

La mise à jour de CLAUDE.md reste à la discrétion du PO.