Aller au contenu

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

1. Résumé exécutif

Métrique Valeur
Objectif initial GET /documents/:id/download avec audit zero-knowledge
Résultat obtenu Conforme
Verdict final GO (8.25/10)
Tests contractuels 104/104 passés

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 2h 1 0%
2 - Tests 1h 1h 1 0%
3 - Gate spec 1h 2h 2 +100%
4 - Plan 1h 1.5h 1 +50%
5 - Gate plan 1h 2h 2 +100%
6 - Implémentation 4h 5h 1 +25%
7 - Acceptabilité 2h 2h 1 0%
8 - Gate acceptabilité 1h 1h 1 0%
9 - REX 30 min 1h 1 +100%
Post-merge fixes 0 2h 6 N/A
TOTAL ~14h ~20h 17 +43%

2.2 Scores de convergence par gate

Gate Score v1 Score final Delta Itérations
Gate 3 5.93/10 8.38/10 +2.45 2
Gate 5 6.28/10 8.50/10 +2.22 2
Gate 8 8.25/10 8.25/10 0 1

2.3 Écarts par catégorie

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

3. Points fluides

Ce qui a bien fonctionné : - Architecture zero-knowledge : le pattern pre-signed URL + fail-closed a été bien compris et implémenté du premier coup - Mapping INV/CA rigoureux : la traçabilité spec → code → tests a facilité Gate 8 - Modularité du code : AuditDownloadService, S3PresignService, DocumentAccessGuard bien séparés - Tests unitaires complets : 104 tests couvrant tous les cas d'erreur et flux nominaux - Gate 8 en une itération : l'implémentation était conforme aux specs corrigées

4. Points difficiles

Obstacles rencontrés (sans justification) : - Gate 3 v1 : 5.93/10 — spec initiale trop vague sur fail-closed, audit et flux partage/B2B - Gate 5 v1 : 6.28/10 — plan incomplet (migration ⅗ champs, absence Phase 0 go/no-go) - Pipeline post-merge : 6 commits — clés HSM orphelines + Sonar security hotspot - Pipelines bloqués en "canceling" — runners OVH occupés pendant 17+ minutes

5. Hypothèses révélées tardivement

Hypothèses non explicites découvertes en cours de workflow : - Fail-closed vs retry — découverte à Gate 5 v1 : distinction infra (retry OK) vs appli (fail-closed strict) - Tables document_shares / co_holders inexistantes — découverte à l'étape 6 : flux partage/B2B non implémentables - INV-04 key naming stricte — découverte post-merge : tests PD-7 vérifient les labels de TOUTES les clés HSM - Math.random() flaggé par Sonar — découverte post-merge : même pour un correlation ID non-sécuritaire

6. Invariants complexes

Invariants difficiles à implémenter ou sensibles aux régressions : - INV-63-05 (fail-closed) — TC-INT-14 : audit AVANT réponse client, pas de download sans trace - INV-63-07 (messages neutres) — TC-SEC-12 : même message d'erreur pour 403/404 (anti-énumération) - INV-63-03 (zero-knowledge) — TC-SEC-05 : backend ne retourne jamais le contenu, seulement une URL

7. Dette technique

Compromis acceptés et non bloquants : - checkShareAccess() stubé — impact: faible (table à créer dans future story PD-XX) - checkB2BAccess() stubé — impact: faible (table à créer dans future story PD-YY) - Rate limiting hors scope — impact: moyen (à implémenter au niveau API Gateway)

8. Risques résiduels

Risque Type Probabilité Impact Mitigation
URL pre-signed exposée dans logs client ops faible moyen TTL 5min, audit côté serveur
Glacier restoration timeout tech moyen faible HEAD Object → 503 documenté
Clés HSM orphelines post-test ops moyen faible Cleanup script à ajouter

8bis. Matrice de délégation inter-PD

Story Direction Statut Nature de la dépendance Problème rencontré
PD-46 ← dépend de DONE S3 presign, storage layer RAS
PD-60 ← dépend de DONE Document upload, entities RAS
PD-31 ← dépend de DONE Audit service, événements RAS
PD-7 ← dépend de DONE HSM FIPS, key naming INV-04 labels stricts
PD-XX → bloque TODO Flux partage (document_shares) checkShareAccess() stubé
PD-YY → bloque TODO Flux B2B (co_holders) checkB2BAccess() stubé

8ter. Bugs de tests

Pattern incorrect Pattern correct Cause Coût
correlation_id: /^dl-\d+-[a-z0-9]+$/ /^dl-[0-9a-f]{8}-...-[0-9a-f]{12}$/ Changement randomUUID 15 min
benchmark-key-* pv-test-benchmark-* INV-04 naming 30 min

9. Patterns récurrents détectés

9.1 Patterns confirmés (déjà vus dans d'autres stories)

  • Fail-closed audit pattern — aussi dans PD-31, PD-60
  • Zero-knowledge architecture — aussi dans PD-46, PD-97
  • Pre-signed URL avec TTL — aussi dans PD-46

9.2 Nouveaux patterns identifiés

  • Post-merge pipeline fixes — tests HSM contractuels (PD-7) bloquent le merge si clés non conformes
  • Sonar security hotspots — même Math.random() pour logging est flaggé
  • Pipeline cancellation stuck — jobs HSM/DB peuvent bloquer l'annulation 15+ min

10. Améliorations du workflow

10.1 Améliorations des prompts/templates

Fichier Amélioration suggérée Priorité
templates/prompts/1 Spécification.md Ajouter checklist fail-closed obligatoire pour endpoints sensibles haute
templates/prompts/4 Plan.md Exiger Phase 0 go/no-go pour hypothèses critiques haute
templates/outputs/PD-XX-rex.md Ajouter section "Post-merge fixes" moyenne

10.2 Améliorations des agents

Agent Amélioration suggérée Justification
agents/agent-developer.md Ajouter règle crypto.randomUUID() pour tout ID aléatoire Éviter hotspots Sonar
agents/agent-qa-unit-integration.md Vérifier que les regex de test sont génériques (UUID, timestamps) Éviter casse si format change

10.3 Améliorations du processus

  • Cleanup HSM post-test automatique — ajouter job GitLab pour supprimer clés pv-test-* orphelines
  • Surveiller pipeline activement — ne pas attendre passivement, utiliser watch-pipeline.sh systématiquement
  • Annuler pipelines bloqués — forcer cancel des jobs individuels si pipeline stuck en "canceling"

11. Enseignements clés

  1. Fail-closed dès la spec — contractualiser le comportement en cas d'échec audit dès Gate 3 évite 2+ itérations
  2. Phase 0 go/no-go systématique — valider les hypothèses critiques (tables existantes, services disponibles) avant implémentation
  3. Labels HSM stricts — utiliser pv-test-* pour tout clé éphémère, PD-7 vérifie INV-04 globalement
  4. crypto.randomUUID() toujours — Sonar flagge Math.random() même pour logging, utiliser randomUUID par défaut
  5. Pipeline monitoring actif — surveiller avec barre de progression, annuler pipelines bloqués manuellement

12. Métriques cumulatives

Métrique Cette story Moyenne projet Tendance
Temps total 20h 16h
Itérations gates 5 4.2
Écarts totaux 19 12.5
Score convergence moyen 8.38/10 8.1/10
Post-merge fixes 6 1.5 ↑↑

REX généré le 2026-02-21 par Claude (Orchestrateur)