Retrospective — PD-177¶
Resume story¶
- Story : PD-177 — Configurer wallet Ethereum et gestion cles privees
- Domaine : blockchain
- Date : 2026-02-23
- Gates : G3 GO (v2, 8.25/10) | G5 GO (v2, 8.45/10) | G8 GO (v2, 8.60/10)
- Duree totale : 16h
- Iterations totales : 6 (2+2+2)
Learnings de cette story¶
Depuis les gates¶
| Gate | Verdict | Score | Iter | Tags | Note |
|---|---|---|---|---|---|
| G3 | GO (v2) | 8.25 | 2 | #blockchain #wallet #ethereum #custody #spec-v2 | Politique confirmations par reseau (chainId->confirmations+timeout) doit etre contractualisee des la spec v1. Les mappings error-code necessitent verification pre-spec. |
| G5 | GO (v2) | 8.45 | 2 | #blockchain #wallet #ethereum #kms | Mecanisme fail-closed NestJS interceptor doit decrire la sequence RxJS post-handler (tap/catchError apres next.handle), pas pre-handler — ecart systematique dans les plans de securite. |
| G8 | GO (v2) | 8.60 | 2 | #blockchain #wallet #security #secret-leak #defense-in-depth | WeakSet anti-cycles + MAX_SCAN_DEPTH + boundary tests resolvent les ecarts securite en 1 iteration — defense-in-depth avec S2-KMS rend les bypasses theoriques acceptables. |
Depuis le REX¶
- Learnings-as-invariants : Transformer learnings en invariants contractuels (INV-177-20 PostgreSQL, INV-177-21 BullMQ) est le mecanisme le plus efficace — verifies par gates, zero ecart constate.
- Fail-closed NestJS : Interceptor RxJS post-handler (tap/catchError), jamais Guard — les plans qui ne precisent pas la sequence RxJS sont systematiquement signales en Gate 5.
- Defense-in-depth cadrage : Les reviewers LLM surestiment les ecarts sur les couches secondaires sans considerer les barrieres primaires (KMS/HSM). Le cadrage explicite evite des MAJEUR injustifies.
- Scan recursif : 3 protections obligatoires (WeakSet anti-cycles, MAX_DEPTH configurable, extraction methodes) pour tout parcours recursif de structures JSON.
- 2 iterations par gate : Norme observee sur le domaine blockchain (5 stories, 100% des gates).
Patterns recurrents (domaine blockchain)¶
Analyse sur 5 stories blockchain (PD-52, PD-53, PD-55, PD-245, PD-177)¶
| Pattern | Stories | Gates | Impact |
|---|---|---|---|
| Formalisme RFC manquant dans spec v1 | PD-55, PD-177 | G3 | NON_CONFORME ou RESERVE v1 — canonicalisation RFC 8785, formats preuve, politiques confirmations absents des specs initiales. Cause 2 iterations Gate 3 systematiquement. |
| Sonar detecte ce que ESLint/TSC ne voient pas | PD-55, PD-177, PD-53 | G8 | BullMQ deprecated API (getRepeatableJobs), PostgreSQL index partiels, storage packing — uniquement detectes par Sonar. Scan local obligatoire avant Gate 8. |
| 2 iterations par gate = norme blockchain | PD-52, PD-53, PD-55, PD-245, PD-177 | G3/G5/G8 | 100% des stories blockchain passent en 2 iterations. Score v1 moyen ~7.5, score v2 moyen ~8.5. Le domaine blockchain est structurellement plus exigeant que auth-identity. |
| Learnings-as-invariants : ROI maximal | PD-177 | G3/G5/G8 | INV-177-20 (PostgreSQL) et INV-177-21 (BullMQ) issues de learnings PD-55 : zero ecart en 3 gates. Chaque invariant-learning evite ~1.5 iterations. |
| Code contracts avec owner_agent + dependencies | PD-245, PD-177, PD-55 | G5 | Le pattern multi-agents avec code contracts explicites (owner_agent, invariants, forbidden, dependencies) reduit les conflits d'integration en etape 6c. |
Analyse globale (30 dernieres entrees, 173 total)¶
| Tag | Stories distinctes | Seuil | Alerte |
|---|---|---|---|
#backend | 26 | >= 5 | FORTE — Concentration massive sur le backend. Normal pour la phase actuelle du projet. |
#crypto | 19 | >= 5 | FORTE — Domaine central ProbatioVault. Les learnings crypto sont les plus techniques et les plus impactants. |
#security | 11 | >= 5 | FORTE — Securite transversale. Les ecarts SEC apparaissent surtout en Gate 8, pas en Gate 3. Pattern : anticiper en ajoutant pre-review securite en etape 4. |
#testing | 10 | >= 5 | FORTE — Tests = friction principale. Coverage, mocking, E2E vs unitaire, ESM compat, fixtures dynamiques. |
#plan | 8 | >= 5 | FORTE — Gate 5 (plan) est le deuxieme point de friction apres Gate 3. Les plans manquent souvent de resilience, tracabilite, et contraintes techniques explicites. |
#blockchain | 5 | >= 5 | FORTE — 5 stories blockchain completees. Patterns consolides (formalisme RFC, Sonar, iterations). |
#spec-incomplete | 3 (NON_CONFORME) | >= 2 NON_CONFORME | PATTERN BLOQUANT — 3/7 NON_CONFORME sont causes par specs incompletes. Domaine auth-identity principalement. |
Pattern bloquant : NON_CONFORME Gate 3¶
7 NON_CONFORME au total : - 6 sur 7 en Gate 3 (revue specification) — Gate 3 est le point de rejet principal - 0 en Gate 8 — aucune implementation rejetee apres passage Gates 3+5 - Domaines : auth-identity (5), mobile-ios (1), blockchain (0) - Tags recurrents : #spec-incomplete (3), #security (3), #rate-limiting (2)
Insight : Le domaine blockchain n'a JAMAIS recu de NON_CONFORME. Les specs blockchain sont plus formalisees (RFC, cryptographie) ce qui force la rigueur des la v1.
Recommandations¶
Priorite haute (>= 5 stories ou NON_CONFORME recurrent)¶
-
Checklist completude specs auth-identity : Ajouter dans
templates/prompts/1 Specification.mdune checklist specifique au domaine auth : JWT requirements, rate-limiting thresholds, session invalidation bounds, observability metrics, Keycloak delegation scope. Justification : 5/7 NON_CONFORME proviennent de ce domaine. -
Pre-review securite en etape 4 : Pour les stories blockchain/crypto, ajouter une verification securite legere dans le prompt de plan (etape 4) couvrant : fail-closed mecanisme (sequence RxJS), defense-in-depth cadrage, barrieres primaires identifiees. Justification : les ecarts SEC apparaissent en Gate 8 (+1.20 delta v1->v2 pour PD-177) — les anticiper en etape 4 reduirait les iterations Gate 8.
Priorite normale¶
-
Systematiser learnings-as-invariants : A chaque etape 9, identifier les 2-3 learnings les plus impactants et les transformer en invariants pour les prochaines stories du meme domaine. ROI mesure : zero ecart sur PD-177 pour les invariants issus de PD-55.
-
Injection formalisme RFC dans prompt spec blockchain : Ajouter dans
templates/prompts/1 Specification.mdune section conditionnelle blockchain : "Pour les stories blockchain, inclure : format canonique (RFC 8785), format preuve (champs obligatoires), politique confirmations par reseau, circuit breaker/escalade". Justification : PD-55 et PD-177 ont eu 2 iterations Gate 3 pour ce meme manque. -
Scanner Sonar local systematique : Le pattern "Sonar detecte ce que ESLint/TSC ne voient pas" est confirme sur 6+ stories (PD-55, PD-177, PD-107, PD-31, PD-44, PD-82). Le scan Sonar local (Phase 1.5 de
/gov-accept) est deja documente mais doit etre renforce comme BLOQUANT (pas optionnel) avant les reviews LLM.
Signal CLAUDE.md¶
Patterns forts identifies justifiant une revision :
Section : "Templates prompts > Specification"¶
Suggestion : Ajouter un bloc conditionnel par domaine dans le prompt specification :
## Contraintes specifiques domaine
### Si domaine = blockchain/crypto :
- Format canonique obligatoire (RFC 8785 ou equivalent)
- Politique confirmations par reseau : chainId -> confirmations + timeout
- Format preuve : champs obligatoires (hash, timestamp, signature, blockchain_ref)
- Circuit breaker et mecanisme escalade pour depassements
### Si domaine = auth-identity :
- JWT requirements : audience, issuer, expiration, signing algorithm
- Rate limiting : seuils par endpoint, stockage (Redis obligatoire)
- Session invalidation : latence bornee, mecanisme de propagation
- Keycloak delegation : scope, observability, fail-closed
Section : "Etape 7 > Acceptabilite"¶
Suggestion : Renforcer le scan Sonar local comme prerequis BLOQUANT (pas optionnel) :
Phase 1.5 (Sonar local) est BLOQUANTE. Si Sonar QG ERROR -> STOP avant reviews LLM.
Justification : 6+ stories avec corrections post-Gate 8 causees par Sonar QG FAILED.
Section : "Learnings > Capitalisation"¶
Suggestion : Ajouter une regle de capitalisation systematique :