Aller au contenu

PD-275 — Rétrospective

Contexte

Cette rétrospective analyse PD-275 (PV Anchor — ANCHOR-16/17 finality depth + signer revocation) dans le contexte des 4 stories récentes du Sprint 9 : PD-251, PD-276, PD-277, PD-275. Corpus total : 247 learnings.

1. Patterns récurrents confirmés

P1 — Sonar Phase 1.5 systématiquement contournée (3 stories consécutives)

Stories : PD-275, PD-276, PD-277 (Sprint 9 complet) Cause racine : Token Sonar référencé au mauvais chemin Vault (kv/data/ci/sonar au lieu de kv/data/ci/sonarqube) + URL incorrecte dans Vault (sonarqube.dev.probatiovault.com au lieu de sonar.dev.probatiovault.com) Impact : Phase 1.5 BLOQUANTE du workflow gouvernance contournée de facto depuis 3 stories. Les learnings historiques (PD-107, PD-44, PD-248, PD-63, PD-55) montrent que Sonar détecte des problèmes invisibles aux autres outils (BullMQ deprecated API, security hotspots, React key violations, crypto.randomUUID).

Recommandation : BLOQUANT — Configurer le token Sonar dans Vault AVANT le prochain sprint. ✅ RÉSOLU (2026-02-28) — Chemin Vault corrigé dans gov-accept.md et probe-capabilities.sh. URL corrigée dans Vault. Phase 1.5 sera opérationnelle dès le prochain sprint.

P2 — Gate 3 nécessite correction simultanée spec+tests (4e occurrence)

Stories : PD-275 (delta=0.25 en v2), PD-251, PD-277 (historiques similaires) Pattern : Quand la spec est corrigée (ajout d'invariants) sans réalignement des tests, le revieweur voit des invariants sans tests → score testability chute → stagnation. Preuve PD-275 : v1→7.875 (RESERVE), v2→8.125 (delta=0.25, STOP convergence), v3→9.062 (après correction tests). L'itération v2 n'a rien apporté car les tests n'étaient pas alignés.

Recommandation : Modifier le prompt de correction Gate 3 pour exiger explicitement : "Si des invariants sont ajoutés à la spec, le document de tests DOIT être corrigé dans la même itération."

P3 — Fail-closed comme pattern universel (7+ stories)

Stories : PD-275, PD-277, PD-276, PD-251, PD-250, PD-240, PD-238 Pattern : Toute feature sécuritaire nécessite un guard fail-closed (deny-by-default). Le learning PD-39 injecté au démarrage de PD-275 a été directement utile (INV-275-01).

Statut : Pattern mature, bien documenté dans les learnings et CLAUDE.md. Aucune action nécessaire.

P4 — Machine à états explicite (7+ stories)

Stories : PD-275, PD-277, PD-276, PD-264, PD-251, PD-250, PD-82 Pattern : Les transitions d'état autorisées/interdites doivent être modélisées explicitement (enum + constante VALID_*_TRANSITIONS). PD-275 : signer ACTIVE→REVOKED autorisé, REVOKED→* interdit.

Statut : Pattern mature. Aucune action nécessaire.

P5 — Guard HTTP vs worker BullMQ (nouveau, 1 occurrence)

Story : PD-275 uniquement Pattern : Un guard NestJS HTTP est inutile quand le flux passe par un worker BullMQ. Le plan v1 avait créé C8 (SignerActiveGuard) supprimé en Gate 5. Risque de récurrence : Moyen — le backend ProbatioVault utilise BullMQ pour plusieurs flux (anchor, signature, archivage).

Recommandation : Ajouter un check dans le prompt étape 4 (Plan) : "Pour chaque guard/middleware, vérifier si le point d'entrée est un endpoint HTTP ou un worker BullMQ."

2. Analyse quantitative Sprint 9

2.1 Convergence des gates

Story G3 iters G5 iters G8 iters Total G3 final G5 final G8 final Moy. finale
PD-251 2 2 1 5 8.17 8.67 8.75 8.53
PD-277 2 3 1 6 8.25 8.75 9.125 8.71
PD-276 2 1 1 4 7.50 7.25 8.375 7.71
PD-275 3 2 1 6 9.062 9.312 9.0 9.125
Moyenne 2.25 2.0 1.0 5.25 8.25 8.50 8.81 8.52

Observations : - Gate 8 GO en v1 systématique (4/4) — le processus est suffisamment robuste en amont. - Gate 3 est la plus consommatrice d'itérations (2.25 en moyenne) — les specs initiales manquent régulièrement de précision. - PD-275 a le meilleur score final (9.125) malgré 3 itérations en G3 — la rigueur des corrections itératives paie. - PD-276 a les scores les plus bas (7.71) — complexité crypto Argon2id/RFC 9106 + zero-knowledge pattern.

2.2 Distribution des écarts

Catégorie PD-251 PD-277 PD-276 PD-275 Total %
ECT 2 5 7 1 15 22%
DIV 4 5 11 14 34 50%
AMB 1 12 6 2 21 31%
SEC 5 2 1 1 9 13%
PERF 0 0 0 0 0 0%

Tendance : DIV (divergences spec/impl) dominent à 50% — le principal risque reste l'écart entre ce qui est spécifié et ce qui est implémenté. AMB (ambiguïtés) en forte hausse via PD-277 (12 ambiguïtés liées aux contradictions internes de la spec nonce/PKI).

2.3 Temps

Story Heures Complexité
PD-251 4.1 medium
PD-277 3.5 simple
PD-276 4.4 simple
PD-275 4.3 simple
Moyenne 4.08

Le temps moyen est stable (~4h) quel que soit le domaine (legal-compliance, crypto, blockchain).

3. Améliorations process à appliquer

A1 — Token Sonar dans Vault (CRITIQUE) — ✅ FAIT (2026-02-28)

Fichier : Aucun — action opérationnelle Action : Configurer kv/data/ci/sonar dans HashiCorp Vault avec le token SonarQube. Credentials déjà présents dans Vault à kv/data/ci/sonarqube (login/password, pas token). URL corrigée dans Vault (sonar.dev.probatiovault.com au lieu de sonarqube.dev.probatiovault.com). Scripts gov-accept.md et probe-capabilities.sh mis à jour. Priorité : BLOQUANTE Résolue — probe-capabilities.sh confirme sonar: available.

A2 — Correction simultanée spec+tests en boucle Gate 3

Fichier : governance/CONSTITUTIONAL.md Article II § Cohérence spec/tests Action : Ajouter règle de correction simultanée spec+tests. Règle ajoutée : "Toute modification de la spécification DOIT être reportée dans le document de tests dans la même itération." (CONSTITUTIONAL.md v1.2 → v1.3) Priorité : Haute FAIT (2026-02-28)

A3 — Check HTTP vs worker dans prompt Plan

Fichier : templates/prompts/4 Plan d'implémentation.md Action : Ajouter un check HTTP vs worker BullMQ. — Écarté (1 occurrence unique, Gate 5 attrape naturellement ce type d'écart) Priorité : Moyenne N/A

4. Signal CLAUDE.md

Les améliorations A2 et A3 impactent des fichiers de gouvernance. A2 touche potentiellement CONSTITUTIONAL.md (Article I, section correction Gate 3). Validation humaine requise avant application.

5. Learnings as invariants

Les learnings suivants ont atteint le seuil de récurrence (3+ stories) et pourraient être promus en invariants :

Learning Occurrences Candidat invariant
Fail-closed obligatoire 7+ stories Déjà dans CLAUDE.md
Machine à états explicite 7+ stories Déjà dans CLAUDE.md
Correction spec+tests simultanée 4 stories Nouveau candidat → A2
Sonar Phase 1.5 bloquante 8+ stories historiques Déjà dans procedures.md