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.