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
- Fail-closed dès la spec — contractualiser le comportement en cas d'échec audit dès Gate 3 évite 2+ itérations
- Phase 0 go/no-go systématique — valider les hypothèses critiques (tables existantes, services disponibles) avant implémentation
- Labels HSM stricts — utiliser
pv-test-* pour tout clé éphémère, PD-7 vérifie INV-04 globalement - crypto.randomUUID() toujours — Sonar flagge Math.random() même pour logging, utiliser randomUUID par défaut
- 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)