Retrospective — PD-282¶
Resume story¶
- Story : PD-282 — ProofEnvelope : scellement HSM (PROOF-14) + materiel validation eIDAS (PROOF-05b)
- Domaine : legal-compliance
- Date : 2026-03-02
- Gates : G3 RESERVE (v3, 8.25/10) | G5 RESERVE (v3, 7.875/10) | G8 GO (v2, 9.125/10)
- Score convergence moyen : 8.42/10
- Temps actif : ~5h | Iterations totales : 8 (G3:3, G5:3, G8:2)
- Learnings captures : 11
Learnings de cette story¶
Depuis les gates¶
| Gate | Verdict | Score | Iter | Tags | Note |
|---|---|---|---|---|---|
| G3 v1 | NON_CONFORME | 6.56 | 3 | #hsm, #eidas, #proof-envelope, #seal | Testability 4.75 (formats non contractualises). Fixer les defauts formels expose les lacunes de fond. |
| G3 v3 | RESERVE | 8.25 | - | #proof-envelope, #eidas, #state-machine, #ddl | Spec corrigee pendant impl — re-gate 3 valide absence de regression |
| G5 v1 | NON_CONFORME | 6.69 | 3 | #hsm, #eidas, #plan, #code-contracts | INV-282-03 trop large ; invariants normatifs vs techniques non distingues |
| G5 v3 | RESERVE | 7.875 | - | #proof-envelope, #eidas, #signedAt, #invariant-precision | Convergence atteinte (delta < 0.5, mean >= 7) |
| G8 v1 | NON_CONFORME | 7.19 | 2 | #crypto, #hsm, #ecdsa, #ocsp, #jsonb, #trust-anchor | 3 BLOQUANTS : double-hash crypto, structure JSONB, trust anchor bypass |
| G8 v2 | GO | 9.125 | - | #crypto, #security, #ocsp, #ssrf | +1.94 delta — corrections ciblees tres efficaces |
Depuis le REX¶
| # | Pattern | Tags |
|---|---|---|
| 1 | crypto.verify(null) pour raw ECDSA matching CKM_ECDSA — createVerify() ajoute un hash implicite | #crypto, #hsm, #ecdsa, #nodejs |
| 2 | Stocker l'objet direct dans JSONB, pas le wrapper de transport | #crypto, #jsonb |
| 3 | trustedRoots obligatoire dans tout service de verification de certificats | #crypto, #security, #trust |
| 4 | Triple NON_CONFORME v1 = complexite maximale (8+ iterations) | #workflow, #gate, #pattern |
| 5 | ALTER TYPE ADD VALUE PostgreSQL dans transaction separee (55P04) | #postgresql, #migration, #enum |
| 6 | SSRF via AIA certificate extensions — allowlist OCSP obligatoire | #security, #ocsp, #ssrf |
Patterns recurrents (domaine legal-compliance / crypto)¶
Tags a forte recurrence (>= 5 stories) — alerte forte¶
| Tag | Stories | Tendance | Impact |
|---|---|---|---|
#crypto | 24 stories | Stable — domaine structurant | Chaque story crypto genere des pieges non anticipes. Axe fragile en testability. |
#security | 16 stories | Stable | Fail-closed systematiquement absent en v1 → NON_CONFORME |
#code-contracts | 10 stories | Stable | Ancre dans le workflow, mais invariants parfois trop larges (PD-282 INV-03) |
#hsm | 6 stories | En hausse | Incompatibilites non documentees (CKM_ECDSA, double-hash, dsaEncoding) |
#postgresql | 6 stories | Nouveau cluster | Chaque migration DDL revele un piege different |
#compliance | 7 stories | En hausse | Domaine legal-compliance en croissance rapide |
Patterns confirmes cross-stories (>= 3 occurrences)¶
| Pattern | Occ. | Stories recentes | Impact |
|---|---|---|---|
| Fail-closed obligatoire securite | 11+ | PD-282, PD-242, PD-39, PD-82 | NON_CONFORME quand manquant |
| Format non contractualise en spec v1 | 12+ | PD-282, PD-280, PD-277 | Testability < 6 en v1 |
| Machine a etats explicite | 11+ | PD-282 (SEALED), PD-280 (PENDING), PD-278 (DIP) | GO accelere quand bien formalise |
| Stubs inter-PD documentes | 11+ | PD-282 (OCSP Mode B), PD-251 | MAJEUR → mineur quand trace |
| Triple NON_CONFORME v1 | 3 | PD-282, PD-280, PD-278 | Predicteur : 8+ iter, corrections structurelles |
| Migration DDL PostgreSQL | 4+ | PD-282 (55P04), PD-55 (subquery), PD-264, PD-272 | Pipeline CI casse |
Axe fragile (score moyen < 7.5)¶
| Axe | Gate | Score PD-282 | Score domaine moyen |
|---|---|---|---|
| testability | G3 | 7.5 (v3, apres 4.75 en v1) | ~7.2 |
| coverage | G5 | 7.5 (v3) | ~7.5 |
| coherence | G5 | 7.5 (v3, regresse de 8.5 en v1) | ~7.8 |
Nouveaux patterns identifies (PD-282)¶
| Pattern | Source | Impact |
|---|---|---|
| Double-hash crypto pipeline HSM | E-01 | BLOQUANT — non detectable par mocks, masque par taille identique SHA3-384/SHA-384 |
| JSONB wrapper vs objet direct | E-02 | Bug silencieux — mocks DB ne le detectent pas |
| SSRF via AIA certificate extensions | S-03 | ELEVE — vecteur d'attaque sur toute story OCSP |
| Gate 8 delta massif apres corrections BLOQUANTES | +1.94 | Les BLOQUANTS bien identifies convergent vite |
Recommandations¶
Priorite haute (>= 5 stories ou NON_CONFORME recurrent)¶
- R-01 : Ajouter dans
templates/prompts/1-specification.mdl'exigence de documenter le pipeline sign ET verify complet (algorithme, encodage DER/IEEE-P1363, API Node.js cible) pour toute story avec signature HSM. -
6 stories HSM, toutes avec pieges crypto non anticipes.
-
R-02 : Ajouter dans
templates/prompts/7c-review-security.mdla verification que tout parametretrustedRoots/ trust-store est obligatoire dans les services de verification de certificats. -
PD-282 S-01 — bypass silencieux. 11+ stories fail-closed.
-
R-03 : Ajouter dans
templates/prompts/7a-review-code.mdla detection decreateVerify(ALG).update(hash)quand le HSM utilise CKM_ECDSA (raw sign). -
PD-282 E-01. Piege non intuitif Node.js crypto + CloudHSM.
-
R-04 : Documenter le pattern
commitTransaction()/startTransaction()pour migrations TypeORM avec ALTER TYPE ADD VALUE dansCLAUDE.mdsection "Erreurs a eviter". - 2 occurrences (PD-282, PD-279/PD-278). Erreur PostgreSQL 55P04.
Priorite normale¶
- R-05 : Pour les stories OCSP/CRL, contractualiser Mode A (offline) vs Mode B (online constitutif) des la spec.
-
PD-282 — Mode B reste dette technique.
-
R-06 : Exiger un test round-trip DB (INSERT + SELECT + assert structure) pour chaque nouvelle colonne JSONB complexe dans le template agent-entity.
-
PD-282 E-02 — bug silencieux non detecte par mocks.
-
R-07 : Verifier les URLs cibles des requetes OCSP contre une allowlist — ajouter dans review security.
-
PD-282 S-03 — vecteur SSRF non corrige.
-
R-08 : Maintenir un registre des tests CI en echec pre-existants par module.
- 12 echecs pre-existants confondus avec regressions potentielles.
Signal CLAUDE.md¶
Les patterns suivants justifient une mise a jour de CLAUDE.md :
Section "Erreurs a eviter" (existante)¶
Ajouts suggeres :
5. Ne JAMAIS utiliser createVerify(ALG).update(hash) pour verifier une signature HSM CKM_ECDSA
→ utiliser crypto.verify(null, hash, key, sig) pour raw ECDSA (cf. PD-282 E-01)
6. ALTER TYPE ADD VALUE PostgreSQL : TOUJOURS dans une transaction separee
→ commitTransaction() AVANT toute clause WHERE utilisant la nouvelle valeur (cf. PD-282, PD-279)
7. trustedRoots/trust-store OBLIGATOIRE dans tout service de verification de certificats
→ parametre optionnel = bypass silencieux (cf. PD-282 S-01)
Section "Patterns operationnels" (existante)¶
Ajout suggere :
### SSRF via AIA certificate extensions
Les URLs de responders OCSP extraites des extensions AIA des certificats X.509
ne sont PAS fiables. Valider contre une allowlist avant tout appel HTTP.
CONSTITUTIONAL.md (Article IV)¶
Ajout suggere :
Tout module de signature cryptographique DOIT avoir un test contractuel de roundtrip
(sign puis verify sur les memes donnees). Sign et verify ne doivent JAMAIS etre testes
isolement. (Issu PD-282 — double-hash non detecte par tests isoles)
La mise a jour de CLAUDE.md et CONSTITUTIONAL.md reste a la discretion du PO.