1. Documents de référence
- Spécification :
PD-103-specification.md (424 lignes, 18 INV) - Tests :
PD-103-tests.md (496 lignes, matrice couverture complète) - Review P1 (Claude) :
PD-103-review-step3.md - Confrontation P2 (ChatGPT) :
PD-103-confrontation-step3.md
2. Synthèse des écarts
BLOQUANTS (3)
| ID | Type | Description | Source |
| ECT-01 | AMB | Mécanisme d'échange de clé DEK (K_doc) non spécifié — chiffrement local AES-256-GCM mentionne K_doc sans définir sa génération, échange (KEK/key wrapping), ni transmission au backend. | P1 + P2 |
| ECT-02 | SEC | Transmission DEK au backend non documentée — le POST /documents/capture envoie nonce+tag mais pas le DEK. Pipeline scellement bloqué (backend ne peut pas déchiffrer). | P1 + P2 |
| ECT-03 | AMB | Session upload différé non définie — INV-103-24 conditionne reprise à "session valide" sans définir le terme. URL pré-signée S3 (TTL 1-15 min) vs TTL différé (24h) = reprise impossible. | P1 + P2 |
MAJEURS (11)
| ID | Type | Description | Source |
| DIV-01 | AMB | Regex timestamp_device — groupe non-capturant sans ? rend millisecondes obligatoires, contradiction avec plage "24..30". | P1 |
| DIV-02 | AMB | Upload multipart — seuil 10 MB et chunks définis mais jamais mentionnés dans flux nominaux. Comportement indéterminé >10 MB. | P1 |
| DIV-03 | AMB | Transition UPLOADING -> CANCELLED autorisée en §5.7 + diagramme mais aucun invariant INV-103-XX, aucun test, aucun ER. | P1 + P2 |
| DIV-04 | ECT | Contradiction diagramme séquence vs flux — diagramme saute état UPLOADED (retourne directement PENDING_SEAL). | P1 |
| DIV-05 | ECT | INV-103-09 (envelope encryption) non testable — mécanisme KEK/key wrapping non spécifié. | P1 |
| DIV-06 | AMB | fichier probatoire — moment de transition soumis→probatoire non défini. | P1 |
| DIV-07 | AMB | signature_status — localisation (colonne DB ?) et responsabilité initialisation non clarifiées. | P1 |
| DIV-08 | AMB | Tests d'invariants TC-INV-01 à TC-INV-10 sans structure GIVEN/WHEN/THEN — statut ambigu. | P1 |
| DIV-09 | SEC | Aucune vérification d'intégrité du ciphertext uploadé sur S3 (pas de x-amz-content-sha256). | P2 |
| DIV-10 | AMB | timestamp_device accepté sans validation de skew horloge côté serveur. | P1 |
| DIV-11 | DIV | Code API 409 testé (TC-ERR-10/§8) mais non contractualisé dans la spec. | P2 |
MINEURS (4)
| ID | Type | Description | Source |
| MIN-01 | AMB | Multipart non couvert par les tests (conditionnel à clarification). | P1 |
| MIN-02 | AMB | Rate-limit user_id + IP — double risque contournement/NAT mais scope acceptable pour v1. | P2 |
| MIN-03 | AMB | Politique notification à ANCHOR_CONFIRMED non arrêtée. | P2 |
| MIN-04 | AMB | Epic officielle non figée (MOBILE-IOS / PD-195 / EPIC-XX). | P2 |
3. Scoring
Calcul : - Base : 10.0 - 3 BLOQUANTS × -2 = -6.0 - 11 MAJEURS × -1 = -11.0 - 4 MINEURS × -0.25 = -1.0 - Brut : 10 - 6 - 11 - 1 = -8.0 → clamp à 1.0
Les scores par critère :
| Critère | Score | Justification |
| completeness | 5.0 | Spec bien structurée (18 INV, machine à états, bornes) mais 3 bloquants crypto/session manquants |
| testability | 5.0 | Matrice couverture complète mais 10 tests INV sans GIVEN/WHEN/THEN, multipart non couvert |
| clarity | 6.0 | Diagrammes Mermaid présents mais contradictions séquence/flux, K_doc non défini |
| traceability | 7.0 | Bonne traçabilité INV→CA→TC, 2 divergences (409, rate-limit granularité) |
Moyenne : (5.0 + 5.0 + 6.0 + 7.0) / 4 = 5.75