Aller au contenu

PD-55 — Retour d'expérience (REX)

1. Résumé exécutif

Métrique Valeur
Objectif initial Créer worker ancrage blockchain périodique (cycle 10 min, Merkle tree, on-chain)
Résultat obtenu Conforme — Module anchor complet avec processor BullMQ, services, migration, tests
Verdict final GO (Gate 8 : 8.00/10)
Tests contractuels 177/177 passés (coverage branches 80.02%)
Pipeline CI #2342556610 SUCCESS (lint + types + tests + Sonar QG PASSED)

2. Métriques de convergence

2.1 Temps et itérations

Étape Durée estimée Durée réelle Itérations Écart
0 - Besoin 30 min ~30 min 1 0%
1 - Spécification 2h ~1h 1 -50%
2 - Tests 1h ~30 min 1 -50%
3 - Gate spec 1h ~3h 3 (v1→v2→v3) +200%
4 - Plan 1h ~1h30 1 +50%
5 - Gate plan 1h ~2h 2 (v1→v2) +100%
6 - Implémentation 4h ~4h 1 (17 tâches, 9 commits) 0%
7 - Acceptabilité 2h ~3h 2 (v1→v2) +50%
8 - Gate acceptabilité 1h ~1h30 1 +50%
9 - REX 30 min ~30 min 1 0%
TOTAL ~14h ~17h30 14 +25%

2.2 Scores de convergence par gate

Gate Score v1 Score final Delta Itérations
Gate 3 6.25/10 (NON_CONFORME) 8.18/10 (GO) +1.93 3
Gate 5 7.75/10 (RESERVE) 8.38/10 (GO) +0.63 2
Gate 8 8.00/10 (GO) 8.00/10 (GO) 0 1

Pattern de convergence : Gate 3 a nécessité 3 itérations (spec blockchain complexe), Gate 5 en a nécessité 2, Gate 8 a passé du premier coup. Convergence progressive attendue pour une story de complexité élevée.

2.3 Écarts par catégorie

Catégorie d'écart Gate 3 Gate 5 Gate 8 Total
ECT (complétude/testabilité) 3 4 2 9
DIV (divergence spec/impl) 6 0 0 6
AMB (ambiguïté) 8 0 0 8
SEC (sécurité) 1 0 2 3
PERF (performance) 0 0 0 0
TOTAL écarts 18 4 4 26

3. Points fluides

  • Étape 6 (implémentation) : Le DAG de 17 tâches a été exécuté sans blocage majeur. La décomposition en 9 niveaux de parallélisation était précise.
  • Gate 8 : Passage au premier coup (8.00/10 uniforme sur les 4 critères). L'acceptabilité v2 post-corrections a bien préparé le terrain.
  • Pipeline CI : Migration, tests, lint, Sonar — tout validé en CI après corrections post-Gate 8.
  • Learnings injection : Les learnings PD-44, PD-40 et BATCH-RETRO injectés en amont ont évité certaines erreurs (canonicalisation RFC 8785 mentionnée dès la spécification).

4. Points de friction

  • Gate 3 — 3 itérations : La spécification initiale manquait de précision sur l'ordre canonique, le format de preuve externe et le standard de canonicalisation. Ces manques sont typiques des stories blockchain/crypto qui nécessitent un niveau de formalisme élevé.
  • Migration PostgreSQL : L'index partiel avec subquery (WHERE batch_id IN (SELECT ...)) n'est pas supporté par PostgreSQL. Détecté uniquement en CI (pipeline migrate:test-db), pas en local. Coût : 1 commit de correction + 1 re-run pipeline.
  • Coverage branches : Le seuil global de 80% branches a été atteint de justesse (80.02%) en ajoutant 29 tests pour couvrir les branches manquantes des services PD-55. Le code PD-55 était à ~71-77% branches avant optimisation.
  • Sonar deprecated API : 2 violations Sonar (BullMQ getRepeatableJobs/removeRepeatableByKey deprecated en v5). Détecté uniquement par Sonar QG en CI, pas par lint local.
  • CloudHSM cluster down : Blocage transitoire de ~3h sur tous les pipelines du backend. Non lié au code PD-55 mais a retardé la validation.
  • Acceptabilité v1 → v2 : 5 écarts code MAJEURS et 3 vulnérabilités CRITIQUES identifiés par les reviews LLM. Tous corrigés avant Gate 8. Le ratio faux positifs des reviews LLM reste élevé (~30-40%).

5. Invariants vérifiés

INV Description Vérifié par
INV-55-01 Cycle ancrage 10 min ±2 min Tests + BullMQ repeat config
INV-55-02 Unicité événement par batch Migration UNIQUE INDEX + tests
INV-55-03 Racine Merkle SHA-256 64 hex Tests + CHECK constraint
INV-55-04 Immutabilité batch finalisé Trigger PostgreSQL + tests
INV-55-05 Horodatage UTC ISO-8601 Tests unitaires
INV-55-06 Atomicité rollback Tests process + failBatch
INV-55-07 Détection gap fenêtre Tests AnchorAlertService
INV-55-08 Idempotence ancrage Tests TC-55-15
INV-55-09 Retry exponentiel Tests + BullMQ backoff config
INV-55-10 Preuve complète tx_id+merkle+block Tests intégration
INV-55-11 Timeout configurable Tests + ConfigService
INV-55-12 Journalisation PD-31 Tests événements émis

6. Code livré vs plan

6.1 Fichiers créés

Fichier Prévu Livré Conforme
anchor-batch.entity.ts
anchor-batch-event.entity.ts
anchor-batch-status.enum.ts
anchor-batch.service.ts
proof-event.service.ts
anchor-alert.service.ts
blockchain-adapter.service.ts ✅ (STUB)
blockchain-anchor.processor.ts
anchor.controller.ts
anchor.module.ts
anchor.constants.ts
1708600000000-create-anchor-tables.ts
Tests (.spec.ts) 6 suites 8 suites ✅+

6.2 Écarts plan/implémentation

  • blockchain-adapter.service.ts : STUB comme prévu (dépendance PD-52). Fonctions implémentées avec mocks internes.
  • 2 suites de tests supplémentaires non prévues : anchor-alert.service.spec.ts et blockchain-adapter.service.spec.ts (ajoutées post-Gate 8 pour coverage).
  • Migration corrigée post-Gate 8 : subquery index → UNIQUE simple (PostgreSQL ne supporte pas les subqueries dans les index partiels).

7. Complexité technique

Aspect Évaluation
Complexité globale Élevée (blockchain + Merkle + BullMQ + PostgreSQL triggers)
Dépendances PD-52, PD-53, PD-237 (stubs acceptés)
Patterns NestJS Module, Service, Processor, Controller, Entity — bien maîtrisés
Patterns blockchain Merkle tree, confirmation tracking, chain ID mapping
Patterns BullMQ Repeatable jobs, concurrency=1, exponential backoff, onCompleted/onFailed

8. Faux positifs des reviews LLM

Phase Faux positifs Vrais positifs Ratio FP
Gate 3 review ~40% ~60% Élevé
Gate 5 review ~30% ~70% Moyen
Acceptabilité v1 (code) ~33% (3/9) ~67% (6/9) Moyen
Acceptabilité v1 (sécu) ~40% (⅖) ~60% (⅗) Élevé
Gate 8 review ~25% ~75% Acceptable

Causes identifiées : - Contexte partiel dans les prompts (les LLM n'ont pas accès au code complet) - Confusion entre concepts similaires (confirmation vs finalité) - Analyse sans connaissance des stubs/dépendances futures (PD-52)

9. Corrections post-Gate 8

Correction Fichier Nature Pipeline
Subquery index migration 1708600000000 Fix syntaxe PostgreSQL #2342388300
Coverage branches 5 fichiers .spec.ts +29 tests (79.42% → 80.02%) #2342416395
Deprecated BullMQ API anchor.module.ts getRepeatableJobs → getJobSchedulers #2342556610

Impact : 3 pipelines nécessaires pour atteindre le vert. Aucune modification de logique métier.

10. Améliorations de processus suggérées

10.1 Haute priorité

Fichier : templates/prompts/9 Retour d'expérience.md Amélioration : Ajouter section "Corrections post-Gate 8" dans le template REX. Les corrections post-merge (migration, coverage, Sonar) ne sont pas prévues par le template actuel.

10.2 Moyenne priorité

Fichier : CLAUDE.md (section "Étape 6") Amélioration : Ajouter une règle pour valider les migrations PostgreSQL localement avant push. Les subqueries dans les index partiels ne sont pas détectables par TypeScript ou ESLint — seul un pg_dump --schema-only ou un typeorm migration:run en local peut les détecter.

10.3 Basse priorité

Pattern : Le ratio faux positifs des reviews LLM (30-40%) est stable depuis PD-44. Amélioration potentielle : injecter plus de contexte dans les prompts de review (stubs connus, dépendances futures documentées).

11. Métriques COMPOUNDER

{"story":"PD-55","project":"backend","domain":"blockchain","title":"Créer worker ancrage blockchain périodique","completed_at":"2026-02-23","total_time_hours":17.5,"gate_iterations":{"gate3":3,"gate5":2,"gate8":1},"convergence_scores":{"gate3_final":8.18,"gate5_final":8.38,"gate8_final":8.00},"deviations":{"ECT":9,"DIV":6,"AMB":8,"SEC":3,"PERF":0},"complexity":"complex"}

12. Learnings consolidés

  • [Blockchain Anchor] PostgreSQL ne supporte pas les subqueries dans les WHERE des index partiels — valider les migrations avec typeorm migration:run en local avant push.
  • [BullMQ v5] getRepeatableJobs/removeRepeatableByKey deprecated — utiliser getJobSchedulers/removeJobScheduler. Sonar détecte ces violations mais pas ESLint.
  • [Coverage CI] Le seuil global de 80% branches est fragile — chaque nouvelle story doit viser ≥85% branches pour ne pas faire tomber le global sous 80%.
  • [Gate convergence] Les stories blockchain/crypto nécessitent typiquement 3 itérations de Gate 3 — le formalisme requis (canonicalisation, formats de preuve, standards RFC) n'est pas couvert par les spécifications initiales.