Aller au contenu

PD-56 — Retour d'experience (REX)

1. Resume executif

Metrique Valeur
Objectif initial Generation contractuelle de preuve Merkle par eventId
Resultat obtenu Conforme avec reserves (Sonar SKIPPED, coverage 59.5%)
Verdict final GO (Gate 8 v1 — score 9.06/10)
Tests contractuels 120/120 passes (10 suites, 8.5s)

2. Metriques de convergence

2.1 Temps et iterations

Etape Duree estimee Duree reelle Iterations Ecart
0 - Besoin 30 min 7h24 min 1 +1380%
1 - Specification 2h 5 min 1 -96%
2 - Tests 1h 4 min 1 -93%
3 - Gate spec 1h 45 min 3 -25%
4 - Plan 1h 2h49 min 1 +182%
5 - Gate plan 1h 1h40 min 2 +67%
6 - Implementation 4h 30 min 1 -88%
7 - Acceptabilite 2h 30 min 1 -75%
8 - Gate acceptabilite 1h 15 min 1 -75%
9 - REX 30 min 30 min 1 0%
TOTAL ~14h ~14h30 13 +4%

Note : L'etape 0 a absorbe 51% du temps total. La complexite de la specification contractuelle (9 invariants, 15 CA, 6 flux, machine a etats 3 etats) a necessite 3 versions de besoin et une elaboration poussee. Les etapes 1-2 (production Codex) et 6 (implementation) ont ete anormalement rapides grace a la qualite du besoin/plan.

2.2 Scores de convergence par gate

Gate Score v1 Score final Delta Iterations
Gate 3 6.5/10 8.5/10 +2.0 3
Gate 5 6.25/10 8.06/10 +1.81 2
Gate 8 9.06/10 9.06/10 1

2.3 Ecarts par categorie

Categorie d'ecart Gate 3 Gate 5 Gate 8 Total
ECT (completude/testabilite) 1 1 3 5
DIV (divergence spec/impl) 0 3 2 5
AMB (ambiguite) 2 2 1 5
SEC (securite) 0 1 2 3
PERF (performance) 1 0 1 2
TOTAL ecarts 4 7 9 20

3. Points fluides

  • Gate 8 GO en v1 (9.06/10) : Score le plus eleve obtenu en premiere iteration. La rigueur du besoin (etape 0) et du plan (etape 4) a permis une implementation conforme sans correction post-gate.
  • 12/12 composants implementes sans echec : Le decoupage en 4 waves d'execution (fondations, services intermediaires, orchestrateur, validation) a fonctionne sans blocage.
  • Migration DDL conforme REX PD-282 : VARCHAR + CHECK constraint (pas ENUM PG natif) + commitTransaction() avant WHERE. Le pattern est desormais bien ancre.
  • Anti-flood atomique : Le pattern UPDATE WHERE state != 'CORRUPTED' RETURNING * pour INV-56-09 est elegant et evite toute race condition multi-instance.
  • Script off-chain standalone (C12) : Zero import backend, verification SHA-256 pure. Repond a CA-56-03 sans couplage.

4. Points difficiles

  • Etape 0 — 7h24 de redaction de besoin : Complexite inherente a la spec (machine a etats, 6 flux, 9 invariants, 5 codes d'erreur). Le volume de contractualisation est le plus eleve des stories blockchain.
  • Gate 3 — 3 iterations (v1=6.5, v2=7.625, v3=8.5) : La premiere version manquait de completude (6.0) et de clarte (6.0). Chaque iteration a necessite des ajouts structurels (formats, bornes, machine a etats explicite, cas limites).
  • Gate 5 — feasibility a 5.0 en v1 : Le plan initial ne resolvait pas la resolution eventId -> eventHash ni le recalcul ETA. Score critique declenchant NON_CONFORME automatique.
  • Codex en mode agentic : GPT-5.3 bascule systematiquement en mode agentic sur les prompts > 15KB. Fallback vers Ollama (llama3.3:70b, context 16K) pour les reviews. Profondeur d'analyse reduite.
  • Sonar SKIPPED (auth Vault 401) : Credentials Vault expires empechant l'execution de la Phase 1.5 BLOQUANTE. Contournement par report au pipeline CI.

5. Hypotheses revelees tardivement

  • H-56-06 fausse : L'hypothese "proofAvailabilityState est initialise par PD-237" est fausse. PD-237 ne fournit pas cette colonne. Decouverte a l'etape 4 (plan). Corrige par migration PD-56 (C10).
  • Resolution eventId -> eventHash non triviale : L'entity AnchorBatchEvent (PD-55) n'expose pas de colonne eventHash visible. Decouverte a l'etape 4. Resolue par jointure via table source metier.
  • Convention de tri computeRootFromProof() : Le code PD-237 mentionne sorted(a,b) mais aussi un mecanisme base sur l'index de feuille. Ambiguite decouverte a l'etape 5. Non definitivement tranchee mais fonctionnel.

6. Invariants complexes

  • INV-56-09-security-alert-on-first-corruption-detection — TC-NOM-11, TC-ERR-04, TC-ERR-08, TC-ERR-10 : L'atomicite entre transition d'etat et emission d'alerte necessite un pattern transactionnel precis. Le UPDATE ... WHERE ... RETURNING * avec rowCount resout l'anti-flood multi-instance, mais deux patrons concurrents existaient dans le plan (UPDATE atomique vs SELECT FOR UPDATE).
  • INV-56-06-transitions — TC-INV-06, TC-ERR-09, TC-ERR-10, TC-ERR-11 : La machine a etats avec CORRUPTED terminal strict et AVAILABLE->PENDING interdit necessite une couverture exhaustive des transitions (5 autorisees, 2+ interdites). Le cas AVAILABLE->CORRUPTED sur re-lecture est subtil (TC-ERR-11).
  • INV-56-05-auto-verification — TC-NOM-05, TC-ERR-08 : L'auto-verification obligatoire avant tout retour available est critique. Le flux nominal ne peut pas court-circuiter cette etape meme si les donnees persistees semblent valides.

7. Dette technique

  • Coverage module merkle 59.5% < 80% : Inclut fichiers pre-existants (PD-237, PD-54, PD-55). Les fichiers PD-56 neufs sont bien couverts mais aucune mesure isolee n'est fournie. Impact: moyen.
  • Sonar Quality Gate non execute : Credentials Vault expires. Report au pipeline CI. Risque de detection tardive de code smells. Impact: moyen.
  • Etat AVAILABLE jamais persiste en base : Le plan choisit de deduire le statut a chaque appel (lecture seule en nominal). La colonne proof_availability_state restera PENDING pour toutes les feuilles non corrompues. Les requetes analytiques WHERE state = 'AVAILABLE' retourneront toujours 0. Impact: faible (fonctionnellement correct, analytiquement limitant).
  • Reviews LLM degradees (Ollama 16K vs Codex) : Profondeur d'analyse reduite. Les 8 findings securite classes "faux positifs" n'ont pas ete contre-expertises. Impact: faible (Gate 8 GO confirme).
  • 4 questions ouvertes spec non tranchees : Source eventHash, eventId en batch FAILED, politique pending > 120min, env benchmark. Impact: faible (contournees dans le plan).

8. Risques residuels

Risque Type Probabilite Impact Mitigation
Sonar detecte des issues post-merge tech moyen moyen Pipeline CI verifiera. Credentials Vault a renouveler.
Resolution eventId->eventHash fragile si table source change tech faible eleve Jointure a valider sur donnees reelles.
Recalcul ETA non architecturalement resolu ops faible faible Interface C9 prend un seul batch; le flux suivant n'est pas documente.
Protection timing attack non verifiee par test sec faible moyen Plan affirme constantTimeCompare() existant PD-237. A verifier.

8bis. Matrice de delegation inter-PD

Story Direction Statut Nature de la dependance Probleme rencontre
PD-54 <- depend de DONE Construction arbre Merkle, hashPair(sorted(a,b)) Convention de tri ambigue entre spec et code
PD-55 <- depend de DONE Tables anchor_batch_events, anchor_batches Colonne eventHash non visible directement
PD-237 <- depend de DONE Tables merkle_trees, merkle_leaves (6 colonnes) Ne fournit pas proof_availability_state — migration PD-56 requise
ProofEnvelope -> bloque TODO Consommation interne getMerkleProof(eventId) A surveiller lors de l'integration

8ter. Bugs de tests

Aucun bug de test rencontre. 120/120 tests passes en premiere execution.

8quater. Corrections post-Gate 8

Correction Fichier Nature Pipeline
Credentials Vault Sonar config/vault Renouveler token Vault pour Sonar A planifier

9. Patterns recurrents detectes

9.1 Patterns confirmes (deja vus dans d'autres stories)

  • Codex mode agentic sur prompts > 15KB — aussi dans PD-283 Gate 8, PD-293 step 1. Fallback Ollama systematique. Pattern confirme sur 3+ stories.
  • Gate 3 NON_CONFORME en v1 pour stories complexes — aussi dans PD-278 (double NON_CONFORME G3+G5 v1), PD-280, PD-275. Les stories avec machine a etats ou 5+ invariants echouent presque toujours en v1 Gate 3.
  • Sonar SKIPPED par auth Vault — aussi dans PD-283. Les credentials Vault expirent et bloquent Phase 1.5. Pattern a corriger a la racine.
  • VARCHAR + CHECK au lieu d'ENUM PG — depuis PD-282, systematiquement applique (PD-56, PD-265, PD-280). Pattern stabilise.

9.2 Nouveaux patterns identifies

  • Step 0 dominant (>50% du temps total) : Pour les stories crypto/blockchain avec machine a etats, le besoin absorbe la majorite du temps. A surveiller : PD-56 est la premiere story ou l'etape 0 depasse 7h.
  • Gate 8 GO en v1 si plan rigoureux : Quand le plan est suffisamment detaille (12 composants, flux techniques, mapping invariants), l'implementation est conforme en un seul passage. Correle avec le score Gate 5 >= 8.0.
  • Etat jamais persiste mais fonctionnellement correct : Le choix de ne pas persister la transition PENDING->AVAILABLE est un pattern de design (read-derive vs write-persist) qui peut se generaliser aux machines a etats internes read-heavy.

10. Ameliorations du workflow

10.1 Ameliorations des prompts/templates

Fichier Amelioration suggeree Priorite
templates/prompts/1-specification.md Ajouter une section obligatoire "Verification factuelle des hypotheses H-*" avec commande de validation codebase haute
templates/prompts/4-plan-implementation.md Exiger un seul patron de concurrence par mecanisme (pas deux alternatives) moyenne
templates/outputs/PD-56-acceptability.md Exiger le mapping explicite TC-* vers fichiers de test pour la tracabilite haute

10.2 Ameliorations des agents

Agent Amelioration suggeree Justification
Codex (GPT-5.3) Investiguer le seuil de mode agentic (15KB?) et decouper les prompts en consequence 3+ stories impactees
Ollama fallback Augmenter le context a 32K via num_ctx pour les reviews Gate 8 Reviews 16K trop superficielles

10.3 Ameliorations du processus

  • Renouveler proactivement les credentials Vault : Ajouter un check de validite des credentials au demarrage du workflow (etape 0) pour eviter les SKIP Sonar en etape 7.
  • Fournir la coverage isolee des fichiers PD-XX neufs dans l'acceptabilite : un chiffre global qui inclut la dette pre-existante n'est pas actionnable.
  • Limiter step 0 a 2h pour stories blockchain : Si le besoin depasse 2h, escalader vers le PO pour simplifier le perimetre ou decouper en sous-stories.

11. Enseignements cles

  1. Le besoin est l'investissement — 7h24 de besoin ont produit une Gate 8 GO en v1 (9.06/10). L'investissement amont en contractualisation (invariants, machine a etats, formats, bornes) reduit drastiquement les corrections aval.
  2. Un seul patron de concurrence par mecanisme — Deux alternatives dans le meme plan (UPDATE atomique vs SELECT FOR UPDATE) creent de la confusion. Trancher avant Gate 5.
  3. Verifier les hypotheses factuellement avant Gate 3 — H-56-06 (colonne PD-237) etait fausse. Un grep sur le codebase aurait evite une iteration de Gate 5.
  4. Le fallback Ollama 16K est acceptable mais degradant — Art. II respecte, mais profondeur d'analyse insuffisante pour les stories complexes. Prioriser le fix Codex.
  5. L'etat non persiste en nominal est un pattern valide — Ne pas persister PENDING->AVAILABLE quand le statut est re-derivable a chaque appel simplifie le flux et elimine les ecritures inutiles.

12. Metriques cumulatives (auto-calculees)

Metrique Cette story Moyenne projet Tendance
Temps total 14.5h 6.47h haut
Iterations gates 6 5.3 stable
Ecarts totaux 20 14.1 haut
Score convergence moyen 8.54/10 8.45/10 stable