Aller au contenu

PD-103 — Rapport de confrontation (Étape 8)

Ce rapport est produit par l'orchestrateur Claude avant chaque gate PMO.
Il confronte les documents produits pour identifier convergences, divergences et zones d'ombre.

1. Sources confrontées

  • PD-103-specification.md (contenu mixte v2 + v3, incluant sections marquées [v3])
  • PD-103-tests.md (tests contractuels v3)
  • PD-103-acceptability.md
  • PD-103-plan.md
  • Livrables agents : capture-crypto, capture-idempotence, capture-ingest, capture-kek-keyring, capture-migration, capture-ocr, capture-orchestrator, capture-purge, capture-reconciliation, capture-state-machine, capture-store, capture-ui, capture-upload, capture-tests-integration, capture-types

2. Convergences

  • Le flux cœur est aligné : capture applicative iOS -> hash local -> chiffrement local -> upload -> pipeline de scellement -> notification à SEALED (spec §5.⅘.5/5.6, tests TC-NOM-01/08/09, plan §2).
  • Le contrat crypto converge globalement sur SHA3-256, AES-256-GCM, wrapping DEK + kek_id, et exclusion OCR du probatoire (spec INV-103-03/06/30/34/37, tests matrice §2, plan mappings INV).
  • Le modèle de reprise différée est cohérent dans son principe : UPLOAD_DEFERRED + prérequis JWT valide + URL pré-signée fraîche (spec INV-103-24, tests TC-NOM-06/TC-ERR-15, plan §2.2).
  • Les états terminaux CANCELLED et ANCHOR_CONFIRMED sont convergents dans spec/tests/plan (spec INV-103-28, tests TC-NOM-12/TC-INV-10, plan mapping INV-103-28).
  • L’idempotence canonique payload_canonical_sha256 et la sémantique 200/409 sont convergentes au niveau intentionnel (spec §5.12, tests TC-NOM-15/TC-INV-06/TC-ERR-13, livrable capture-idempotence).
  • Le couple supervision SEAL_DELAYED + GC orphelins S3 est convergent sur l’objectif (spec INV-103-33/35/36, tests TC-INV-11/14, plan §2.3).

3. Divergences

⚠️ Les conflits ne doivent JAMAIS être lissés. Chaque divergence est rendue visible.

  • DIV-01 : Contrat SPEC interne incohérent (v2 et v3 cohabitent dans le même fichier)
  • Source A (document) : PD-103-specification.md indique Tolérance skew min/max 0..900 et erreurs contrat sans 422/503.
  • Source B (document) : le même PD-103-specification.md (section [v3]) fixe Tolérance skew à 300..300 et ajoute 422/503.
  • Impact : baseline contractuelle ambiguë (validation, API, tests opposables).

  • DIV-02 : DDL déclaré « non applicable » vs migrations effectivement prévues

  • Source A (document) : PD-103-specification.md §5.10 : « Stratégie de migration DDL : non applicable à cette story ».
  • Source B (document) : PD-103-plan.md (M13) + livrable capture-migration : création capture_events et capture_audit_log.
  • Source C (document) : PD-103-acceptability.md E-02 mentionne un correctif migration↔entités.
  • Impact : contradiction de périmètre DB et traçabilité de gate fragilisée.

  • DIV-03 : Statut SEAL_DELAYED traité à la fois comme flag et comme état DB

  • Source A (document) : PD-103-specification.md v3 : SEAL_DELAYED est un flag, FSM à 8 états.
  • Source B (document) : PD-103-acceptability.md E-03 : « SEAL_DELAYED + 4 états mobiles ajoutés dans enum DB ».
  • Source C (document) : livrable capture-migration : enum DB explicitement à 8 états, sans SEAL_DELAYED.
  • Impact : incohérence structurelle machine d’états/persistance/tests.

  • DIV-04 : Sémantique HTTP 200/202 idempotence non alignée

  • Source A (document) : PD-103-specification.md §5.12 impose 202 (nouveau) et 200 (idempotent).
  • Source B (document) : PD-103-acceptability.md E-04 corrigé par « @HttpCode conditionnel 200/202 ».
  • Source C (document) : livrable capture-ingest (controller) décrit une difficulté à retourner dynamiquement 200 et évoque un status exposé dans le body.
  • Impact : contrat API potentiellement non respecté côté client/monitoring.

  • DIV-05 : État backend à l’ingestion (CAPTURED) vs contrat UPLOADED -> PENDING_SEAL

  • Source A (document) : PD-103-specification.md §5.6 : le commit backend déclenche UPLOADED -> PENDING_SEAL.
  • Source B (document) : livrable capture-ingest : insertion capture_events (state='CAPTURED', signature_status='PENDING_SIGNATURE') et hypothèse H-M9-05 « captures restent en CAPTURED » si pipeline non livré.
  • Impact : divergence sur le statut probatoire réel et sur les SLA de scellement.

  • DIV-06 : Exigence « payload différé chiffré localement » vs fuite OCR en clair

  • Source A (document) : PD-103-specification.md §5.5 : payload différé stocké localement chiffré.
  • Source B (document) : PD-103-acceptability.md S-02 : fuite ocr_text en clair dans AsyncStorage (deferredCaptures).
  • Source C (document) : livrable capture-store : persistance deferredCaptures dans AsyncStorage.
  • Impact : non-conformité sécurité/privacy sur données sensibles locales.

  • DIV-07 : Module annoncé auto-contenu vs modification navigation existante

  • Source A (document) : PD-103-plan.md §11 : « Aucune modification d'autres modules existants. Le module capture est auto-contenu. »
  • Source B (document) : livrable capture-ui : src/navigation/AppNavigator.tsx marqué « MODIFIE ».
  • Impact : écart de périmètre et de gouvernance de changement.

  • DIV-08 : Couverture auth revendiquée vs lacunes reconnues

  • Source A (document) : PD-103-specification.md / PD-103-tests.md incluent 401/403 dans les erreurs contrat.
  • Source B (document) : PD-103-acceptability.md T-01/T-02 : test explicite 403 non prouvé et 401 absent de la matrice.
  • Impact : couverture sécurité incomplète pour gate.

  • DIV-09 : Verdict QA « sans bloquant » vs résidu de majeurs significatifs

  • Source A (document) : PD-103-tests.md verdict QA : « Testable contractuellement (aucun bloquant ouvert...) ».
  • Source B (document) : PD-103-acceptability.md post-correction : 8 MAJEURS résiduels + 4 MINEURS.
  • Impact : lecture gate contradictoire sur la maturité réelle.

  • DIV-10 : Plan infra M15 vs livrables incomplets signalés

  • Source A (document) : PD-103-plan.md inclut M15 capture-s3-config (Terraform).
  • Source B (document) : PD-103-acceptability.md E-09 : « module infra S3 » manquant.
  • Impact : risque sur lifecycle S3/gestion des orphelins non entièrement garanti.

  • DIV-11 : Stack crypto mobile obligatoire vs implémentation décrite partiellement dérogatoire

  • Source A (document) : PD-103-specification.md §10.1 : react-native-quick-crypto + react-native-get-random-values obligatoires.
  • Source B (document) : livrable capture-crypto : usage expo-crypto, SHA3 via @noble/hashes, et rsaOaepWrap explicitement non implémenté dans la classe fournie.
  • Impact : conformité technique et readiness crypto non stabilisées.

4. Zones d'ombre

  • Source normative unique non explicitée entre blocs v2/v3 dans PD-103-specification.md (présence de marqueur codex et sections dupliquées) : baseline de gate non verrouillée.
  • Preuve factuelle de correction des majeurs résiduels absente (références commits dans acceptability, mais pas de rattachement explicite aux tests/fichiers dans ce dossier de confrontation).
  • Contrat API des endpoints d’upload auxiliaires (/presign, multipart-init, multipart-complete, abort) non normé au même niveau que POST /documents/capture.
  • Dépendances PD-55/PD-56/PD-41 restent partiellement en STUB dans plusieurs livrables ; absence de date/owner de clôture consolidés dans ce dossier.
  • Gouvernance des majeurs résiduels (E-05..E-09, T-01..T-02, S-01..S-02) : pas de plan de fermeture unifié avec échéances gate.

5. Recommandation

  • Procéder — convergence confirmée, aucun conflit bloquant
  • Rework nécessaire — divergences à résoudre avant de continuer
  • Escalade — décision humaine requise sur un point structurant