Aller au contenu

PD-287 — Revue de spécification (step 3, v1)

Auditeur technique indépendant — orientation contractualisation, testabilité, conformité. Revue effectuée sur PD-287-specification.md (spec canonique) et PD-287-tests.md (scénarios). Périmètre tests restreint à : ambiguïtés, contradictions, règles non testables, hypothèses dangereuses, risques sécurité/conformité — aucune conclusion sur la couverture.


Synthèse (sans recommandation)

Gravité Nombre
Bloquant 7
Majeur 12
Mineur 9

Écarts — Bloquants

B-01 — Contradiction MVP : export ZIP « obligatoire » vs « nice-to-have »

  • Type : Contradiction
  • Référence : spec §2 Inclus (« Export composite autonome au format ZIP »), §4 INV-287-14, §5.4 F-287-04, §7 CA-287-13, §10.2 Q-287-01/Q-287-06, tests TC-NOM-08, TC-NEG-07, §5 (ligne INV-287-14)
  • Description : L'export ZIP est posé en invariant non négociable (INV-287-14), rattaché à un critère d'acceptation testable (CA-287-13), et aux scénarios TC-NOM-08/TC-NEG-07. Simultanément Q-287-06 précise « Activation MVP de l'export ZIP (nice-to-have) — Décision GO/NO-GO au lancement MVP ». Un élément conditionnel GO/NO-GO ne peut pas être invariant.
  • Impact : Incohérence contractuelle entre §4 (non négociable) et §10.2 (optionnel). Toute décision PO « NO-GO MVP » rendrait INV-287-14 et CA-287-13 immédiatement violés. Gate 8 ne peut pas trancher.

B-02 — Contradiction SLA révocation : 5 s (CA) vs 2 s (défaut SLO)

  • Type : Contradiction
  • Référence : §4 INV-287-08, §5.2 revocation_effective_latency_p95_ms (défaut 2000, max 5000), §5.3 sla_revocation_effective (défaut 2000 ms P95, max 5000 ms), §7 CA-287-08, §9 H-287-03, tests TC-NOM-09 + §9 ligne « CA-287-08 NON TESTABLE »
  • Description : CA-287-08 fixe le seuil d'acceptation à <= 5 s P95, ce qui correspond à la borne maximum du SLO et non à sa valeur par défaut (2000 ms). INV-287-08 renvoie à « la borne SLA » sans dire laquelle. Un système à 3500 ms P95 satisferait CA-287-08 tout en violant la cible contractuelle par défaut §5.3.
  • Impact : Critère d'acceptation permissif laissant passer des implémentations non conformes à la cible opérationnelle. Tests TC-NOM-09 et TC-ERR-10 deviennent ambigus sur la borne à mesurer.

B-03 — Contradiction atomicité : journal append-only « async post-commit » vs « 503 fail-closed »

  • Type : Contradiction
  • Référence : §4 INV-287-13, §5.7 (Journal append-only = « Async post-commit »), §6 ERR-287-14, tests TC-ERR-14
  • Description : §5.7 qualifie le journal d'append-only « async post-commit, idempotent, retry-safe » : la réponse applicative est donc déjà retournée lorsque le journal est écrit. ERR-287-14 précise pourtant que l'indisponibilité du journal déclenche un 503 fail-closed et « aucun contenu probatoire servi ». Les deux régimes ne peuvent coexister : soit le journal est synchrone/bloquant (fail-closed possible), soit il est post-commit (fail-closed impossible sur la requête initiale).
  • Impact : Impossibilité d'écrire des tests déterministes pour TC-NOM-07, TC-NOM-08 et TC-ERR-14 : une panne du journal pendant une consultation aboutirait à un comportement indéterminé (document déjà renvoyé vs 503). Risque probatoire et sécuritaire direct (INV-287-13 violable).

B-04 — Contradiction anti-enumeration : enveloppes non homogènes

  • Type : Contradiction / Risque sécurité
  • Référence : §4 INV-287-12, §6 ERR-287-05 (« 404 générique non différenciant »), §6 ERR-287-09 (401), §6 ERR-287-10/11 (« 403/404 générique selon endpoint »), §7 CA-287-18, tests TC-ERR-05, TC-NEG-02
  • Description : INV-287-12 exige des réponses « non différenciantes ». ERR-287-05 fixe un 404 uniforme. Mais ERR-287-10/11 autorisent « 403 ou 404 selon l'endpoint », et ERR-287-09 impose un 401 distinct pour session invalide. Un attaquant voit ainsi : 404 (token inconnu), 401 (session morte), 403 (lien révoqué selon endpoint), 429 (OTP bloqué). La surface de distinction persiste.
  • Impact : INV-287-12/CA-287-18 ne sont pas satisfaisables contractuellement. TC-ERR-05/TC-NEG-02 testent une homogénéité que la spec elle-même contredit.

B-05 — Règle non testable par absence de politique (INV-287-15)

  • Type : Non testable
  • Référence : §4 INV-287-15 (« selon politique définie »), §10.2 Q-287-04, tests §5 (ligne INV-287-15 partielle), tests §9 (INV-287-15 « NON TESTABLE complet, Bloquant »)
  • Description : INV-287-15 impose la minimisation et la rétention « selon politique définie ». La politique de rétention (durée absolue, exceptions légales, purge) n'est définie nulle part dans la spec et renvoyée à Q-287-04 « Donnée manquante / décision attendue ». Le document de tests flag lui-même cet item en NON TESTABLE / Bloquant.
  • Impact : Un invariant non négociable sans référentiel mesurable est vide de contrat. Gate 8 ne peut pas statuer sur la conformité RGPD.

B-06 — Règle formulée en quantification universelle non prouvable (INV-287-01)

  • Type : Non testable
  • Référence : §4 INV-287-01 (« Le serveur ne DOIT jamais accéder au document en clair »), §7 CA-287-14, tests §5 (ligne INV-287-01 partielle), tests §9 (« INV-287-01 / CA-287-14 formulation absolue "jamais" — NON TESTABLE exhaustif, Majeur »)
  • Description : La spec formule un invariant universel (« jamais, en tout temps, sur tout chemin ») qui ne peut être prouvé par une campagne de tests finie. Le document de tests le reconnaît. Aucune reformulation bornée (périmètre logs / dumps DB / traces mémoire listés) n'est proposée.
  • Impact : INV-287-01 reste non contractualisable. La spec s'auto-contredit via INV-287-25 (« Toute règle est testable ; sinon classée hors périmètre »).

B-07 — Ancrage audit : 300 s vs 900 s

  • Type : Contradiction
  • Référence : §5.2 sla_audit_anchor_delay (absent de §5.2 mais présent en §5.3), §5.3 sla_audit_anchor_delay (défaut 300 s, min 60 s, max 900 s), §9 H-287-06 (« délai max 300 s »)
  • Description : H-287-06 donne un max 300 s ; §5.3 donne un max 900 s (300 s = valeur par défaut). Les bornes contractuelles et l'hypothèse ne concordent pas.
  • Impact : Ambiguïté de seuil sur la réconciliation / alerte (§5.3 « dépassement => alerte + réconciliation d'ancrage »). Tests non spécifiés sur cette borne.

Écarts — Majeurs

M-01 — OTP : absence de plafond cumulé d'échecs

  • Type : Risque sécurité / Hypothèse dangereuse
  • Référence : §4 INV-287-04, §5.2 otp_max_attempts_per_session (5), otp_block_duration_seconds (900 s), otp_blocks_before_owner_notification (3), §7 CA-287-04/CA-287-05, §5.5 transition OTP_BLOCKED -> ACTIVE (cooldown + OTP valide)
  • Description : Le cycle OTP_BLOCKED → ACTIVE est réarmable indéfiniment : après 3 blocages la seule réaction est une notification propriétaire (pas de blocage automatique, pas de verrouillage lien). Un attaquant patient peut itérer 5 essais toutes les 15 min → 480 essais par jour × 10^-6 (6 digits) reste faible mais n'est jamais borné par un plafond total.
  • Impact : CA-287-04/05 cohérents avec la spec mais laissent une faille de conformité. Conséquence directe sur INV-287-04 (« délégation ciblée, non bearer-link ») qui ne garantit pas l'effort de brute-force.

M-02 — INV-287-17 (trust-store) non rattaché à un critère d'acceptation

  • Type : Incohérence Spec↔Tests
  • Référence : §4 INV-287-17, §7 (aucun CA), tests §2 (« CA N/A »), TC-INV-07 / TC-ERR-16 / TC-NEG-08
  • Description : Invariant non négociable sans critère d'acceptation contractualisé. Les tests existent mais ne sont rattachés à aucun CA : un dossier de conformité §3 peut passer GO sans vérifier cet invariant.
  • Impact : Risque d'évasion en acceptabilité Gate 8.

M-03 — CA-287-08 : protocole de mesure P95 non normé

  • Type : Non testable
  • Référence : §5.2 revocation_effective_latency_p95_ms (« contexte de référence : charge nominale »), §7 CA-287-08, tests §9 (ligne CA-287-08 « NON TESTABLE strict inter-environnements »)
  • Description : Le « percentile P95 » est contractuel mais la définition de « charge nominale » (nombre de liens actifs, RPS, topologie) n'est pas fournie. Deux environnements honnêtes peuvent mesurer des valeurs incomparables.
  • Impact : Critère contractuellement vérifiable mais techniquement non reproductible. Tests TC-NOM-09 / TC-ERR-10 restent exécutables mais non comparatifs entre gates.

M-04 — Manifeste d'export : mécanisme d'authenticité absent

  • Type : Risque sécurité
  • Référence : §4 INV-287-14, §5.1 D-287-26 export_manifest_jcs, D-287-27 export_zip_sha256_hex, §7 CA-287-13, tests TC-NEG-07
  • Description : Le manifeste (JCS) et le hash ZIP sont spécifiés, mais aucun mécanisme n'est précisé pour garantir l'authenticité du manifeste hors plateforme : ni signature par ProbatioVault, ni ancrage explicite du manifeste. Un adversaire peut substituer manifeste + ZIP + hash et produire une preuve auto-cohérente sans rupture observable.
  • Impact : TC-NEG-07 « ZIP/manifeste altérés => vérification offline échoue » n'a pas d'observable contractuel : sans signature/ancrage, la vérification locale n'a aucun référentiel de confiance. INV-287-14 / CA-287-13 sont faiblement testables.

M-05 — Journal append-only : structure anti-tamper non spécifiée

  • Type : Risque sécurité / Non testable
  • Référence : §4 INV-287-13, §5.1 D-287-24 audit_event_hash_sha256_hex, §5.4 §7 CA-287-16, tests TC-NOM-14
  • Description : event_hash est défini mais sans chaînage (Merkle, hash-chain, ancrage périodique). Le terme « append-only » ne suffit pas à garantir l'immuabilité d'entrées antérieures : une entrée antérieure peut être réécrite si l'attaquant a accès au backend sans laisser de trace vérifiable externe.
  • Impact : CA-287-16 (« insertion/suppression/modification d'entrée rejetée ») non testable en boîte noire tant que la structure de chaînage / preuve d'intégrité n'est pas contractuelle.

M-06 — INV-287-20 : conditionnalité ambiguë

  • Type : Ambiguïté
  • Référence : §4 INV-287-20 (« obligatoires si concurrence/asynchrone »), §5.6 (mécanismes obligatoires sans condition)
  • Description : L'invariant est conditionnel (« si concurrence/asynchrone ») alors que §5.6 énonce lock, idempotence, réconciliation, rate-limit, clearing comme obligatoires sans condition. L'implémenteur peut argumenter « pas de concurrence ici » pour contourner l'invariant.
  • Impact : Porte ouverte à des implémentations partielles. Tests TC-NOM-05/06/15/16 portent sur des mécanismes que l'invariant rend optionnels.

M-07 — Session inactivity : borne max 12 h disproportionnée

  • Type : Hypothèse dangereuse / Risque sécurité
  • Référence : §5.2 session_inactivity_timeout_seconds (max 43200 s = 12 h), §9 H-287-01 (défaut 30 min)
  • Description : La fenêtre admissible va jusqu'à 12 h sans justification probatoire. Pour un lien de partage d'une preuve sensible délivré à un tiers externe non authentifié, 12 h d'inactivité laisse la session réutilisable après de longs intervalles (reprise d'appareil, perte, emprunt).
  • Impact : Déplafonnement trop haut. INV-287-04 (« non bearer-link ») affaibli pour des configurations admissibles par la spec.

M-08 — Data element recipient_capsule_encrypted_b64 référencé sans définition

  • Type : Incohérence Spec↔Tests
  • Référence : §5bis diagramme de séquence (ligne C-->>S: recipient_capsule_encrypted_b64), §5.1 (aucune entrée D-287-* correspondante)
  • Description : Le diagramme de séquence introduit un champ de retour recipient_capsule_encrypted_b64 sans référencement D-287-* dans le modèle de données canonique. Viole la règle §5.1 (« référencement unique… sans redéfinition »).
  • Impact : Tests F-287-03 / TC-NOM-07 ne peuvent pas vérifier le format de ce champ.

M-09 — Flux de révocation / ré-auth absents du diagramme de séquence

  • Type : Cohérence des diagrammes / Incohérence Spec↔Tests
  • Référence : §5bis diagramme de séquence, §4 INV-287-04 / INV-287-08, §5.4 F-287-02 / F-287-05, §5.5, tests TC-NOM-09, TC-ERR-09, TC-ERR-10
  • Description : Le diagramme de séquence ne modélise ni (a) la réauthentification OTP après session_inactivity_timeout_seconds, ni (b) la révocation propriétaire avec invalidation de session. Ces deux flux sont pourtant couverts par des invariants et critères d'acceptation.
  • Impact : Couverture §5bis incomplète par rapport à §4/§5.5. Les agents d'implémentation n'ont pas de schéma de référence sur ces deux cas critiques.

M-10 — Diagramme d'état : transitions INTERDITE auto-référentes rendues comme boucles

  • Type : Cohérence des diagrammes
  • Référence : §5bis diagramme d'état (lignes PENDING_ACTIVATION --> PENDING_ACTIVATION: INTERDITE, idem ACTIVE/OTP_BLOCKED)
  • Description : Mermaid rend ces lignes comme de vraies boucles d'état (self-loop graphique). Sémantiquement le texte dit « INTERDITE (pas de transition no-op) » mais la représentation visuelle suggère l'inverse.
  • Impact : Confusion pour lecteur humain. Risque d'implémentation d'un no-op autorisé alors qu'il est interdit. §5.5 est la source authoritative mais le diagramme publie une information trompeuse.

M-11 — Régex email D-287-03 : longueur cumulée dépassable (> 254)

  • Type : Ambiguïté / Risque sécurité
  • Référence : §5.1 D-287-03 (length 3..254, regex ^[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{1,190}\.[A-Za-z]{2,63}$)
  • Description : Le regex accepte 64 + 1 + 190 + 1 + 63 = 319 caractères maximum, alors que la contrainte de longueur impose 254. Conflit entre deux contraintes formelles sur le même champ.
  • Impact : Comportement rejet/acceptation non déterministe selon l'ordre d'évaluation (regex d'abord vs longueur d'abord). Tests TC-ERR-02 ne peuvent pas cibler un seuil reproductible.

M-12 — ERR-287-16 en 500 alors que ERR-287-14/15 sont en 503

  • Type : Contradiction
  • Référence : §6 ERR-287-14 (503 fail-closed), ERR-287-15 (503 fail-closed), ERR-287-16 (500 fail-closed)
  • Description : Trois cas de fail-closed sur dépendances critiques (audit, crypto, trust-store) reçoivent des codes HTTP différents sans justification. ERR-287-16 casse l'homogénéité de traitement.
  • Impact : Incohérence contractuelle pour les consommateurs (client mobile / web / export offline). Testabilité affaiblie : TC-ERR-16 attend 500 sur une classe de panne « même nature » que TC-ERR-14/15.

Écarts — Mineurs

m-01 — INV-287-16-envelope-encryption : identifiant non normalisé

  • Type : Ambiguïté
  • Référence : §4 INV-287-16-envelope-encryption (tous les autres invariants : INV-287-NN numérique strict)
  • Description : Suffixe verbeux non normalisé. Toute référence automatisée INV-287-(\d+) échoue sur cet identifiant.
  • Impact : Tracabilité ID fragile (scripts, mapping, learnings-as-invariants).

m-02 — H-287-07 : hypothèse méta sur le process, pas sur le produit

  • Type : Ambiguïté
  • Référence : §9 H-287-07 (« {{LEARNINGS}} n'a pas été injecté dans ce run »)
  • Description : H-287-07 est une hypothèse de processus documentaire, pas une hypothèse fonctionnelle sur le système partagé. Elle n'a pas sa place dans la liste des hypothèses produit.
  • Impact : Bruit contractuel. Confond l'auditeur sur le périmètre (spec vs méta-spec).

m-03 — CA-287-29 : conformité de stack n'est pas un critère d'acceptation fonctionnel

  • Type : Ambiguïté
  • Référence : §7 CA-287-29 (« Stack de la story conforme backend NestJS/TypeORM/PostgreSQL »), §10.1
  • Description : Contrainte projet, pas critère d'acceptation produit. Mélange deux registres de validation (Gate 3 spec vs Gate 5 plan).
  • Impact : Confusion de périmètre.

m-04 — Warning « pas de DRM » : moment d'affichage non spécifié

  • Type : Ambiguïté
  • Référence : §4 INV-287-24, §7 CA-287-26, tests TC-NOM-11
  • Description : La mention est exigée côté propriétaire sans préciser le contexte UI (à la création ? à chaque vue ? une seule fois acceptée ?). TC-NOM-11 vérifie « dans l'interface » ce qui n'est pas falsifiable précisément.
  • Impact : Test faible.

m-05 — Q-287-04 : politique de rétention absente mais rattachée à un invariant

  • Type : Non testable
  • Référence : §10.2 Q-287-04, §4 INV-287-15
  • Description : Doublon signalement avec B-05 mais noté ici parce que §10.2 reconnaît le manque tout en conservant l'invariant §4.
  • Impact : Cohérence §4 ↔ §10.2.

m-06 — Borne inférieure otp_max_attempts_per_session figée à 5

  • Type : Ambiguïté
  • Référence : §5.2 otp_max_attempts_per_session (min=max=5)
  • Description : Min = max = 5 avec marker « rejet config » en cas de dépassement, mais § « Configurabilité » en §5.3 n'est pas reflété pour ce paramètre. La valeur figée n'est pas justifiée par un invariant.
  • Impact : Configuration muette.

m-07 — open_requests_per_ip_per_min : définition d'« open request » implicite

  • Type : Ambiguïté
  • Référence : §5.2 open_requests_per_ip_per_min
  • Description : Le terme « open request » n'est pas défini au §3 (Définitions). Le test TC-NEG-01 (brute-force multi-IP) ne peut cibler ce quota précisément.
  • Impact : Observabilité imprécise.

m-08 — idempotency_window_hours min 1 h — collision potentielle avec rotation rapide de clé

  • Type : Hypothèse dangereuse
  • Référence : §5.2 idempotency_window_hours (min 1 h, défaut 24 h, max 168 h)
  • Description : La fenêtre minimale d'1 h paraît courte sur un MVP avec retry humain différé. Aucun garde-fou sur la désérialisation d'un payload au-delà de la fenêtre.
  • Impact : TC-NOM-15 / TC-ERR-13 reproductibles mais sur une borne très tolérante.

m-09 — ST-287-13 (tests §3) : « compromission de l'un » non observable

  • Type : Non testable
  • Référence : tests §3 ST-287-13 (hypothèse « compromission de l'un »), §7 CA-287-19
  • Description : « Compromission » n'est pas un observable reproductible sans modèle d'attaque formalisé (quel secret est fuité, à quelle couche). Le test s'appuie sur une hypothèse adversariale non bornée.
  • Impact : Scénario interprétable.

Synthèse brute (pour mapping automatique)

Type : Contradiction
Référence : spec §4 INV-287-14, §7 CA-287-13, §10.2 Q-287-06 + tests TC-NOM-08 / TC-NEG-07
Description : Export ZIP posé en invariant non négociable et en critère d'acceptation alors que §10.2 Q-287-06 le classe « nice-to-have » à trancher GO/NO-GO MVP.
Impact : Gate 8 indécidable ; incohérence contractuelle directe §4 ↔ §10.2.
Gravité : Bloquant

Type : Contradiction
Référence : spec §4 INV-287-08, §5.2 (défaut 2000 ms), §5.3 sla_revocation_effective, §7 CA-287-08 (5 s P95)
Description : CA-287-08 fixe 5 s P95 (= borne max) tandis que la valeur par défaut SLO est 2000 ms. INV-287-08 renvoie à « la borne SLA » sans préciser laquelle.
Impact : Ambiguïté sur la cible mesurée ; implémentation à 3500 ms conforme CA mais hors SLO par défaut.
Gravité : Bloquant

Type : Contradiction
Référence : spec §5.7 (journal async post-commit), §6 ERR-287-14 (503 fail-closed), tests TC-ERR-14
Description : Le journal est qualifié d'async post-commit mais son indisponibilité doit déclencher un 503 fail-closed sur la requête initiale, ce qui n'est plus possible après commit et réponse.
Impact : Comportement indéterminé en cas de panne journal ; INV-287-13 violable.
Gravité : Bloquant

Type : Contradiction / Risque sécurité
Référence : spec §4 INV-287-12, §6 ERR-287-05 / ERR-287-09 / ERR-287-10 / ERR-287-11, §7 CA-287-18, tests TC-ERR-05 / TC-NEG-02
Description : INV-287-12 exige des enveloppes non différenciantes mais §6 autorise 401/403/404/429 selon le cas, produisant un signal d'énumération observable.
Impact : INV-287-12 non satisfaisable contractuellement ; tests auto-incohérents.
Gravité : Bloquant

Type : Non testable
Référence : spec §4 INV-287-15, §10.2 Q-287-04, tests §9 « INV-287-15 NON TESTABLE complet, Bloquant »
Description : Politique de rétention non définie, Q-287-04 ouvert, invariant non négociable sans référentiel mesurable.
Impact : Gate 8 RGPD indécidable.
Gravité : Bloquant

Type : Non testable
Référence : spec §4 INV-287-01, §7 CA-287-14, §4 INV-287-25, tests §9
Description : Quantification universelle « jamais en tout temps en tout chemin » non prouvable par campagne finie ; INV-287-25 interdit ce type de formulation.
Impact : Auto-contradiction §4 ↔ §4.
Gravité : Bloquant

Type : Contradiction
Référence : spec §5.3 sla_audit_anchor_delay (max 900 s), §9 H-287-06 (max 300 s)
Description : Hypothèse et SLA divergent sur la borne max d'ancrage audit.
Impact : Seuil d'alerte / réconciliation flou.
Gravité : Bloquant

Type : Risque sécurité / Hypothèse dangereuse
Référence : spec §4 INV-287-04, §5.2 otp_*, §5.5, §7 CA-287-04/05
Description : Aucune borne cumulée d'échecs OTP ; cycle OTP_BLOCKED→ACTIVE réarmable indéfiniment.
Impact : INV-287-04 affaibli, brute-force patient admissible par la spec.
Gravité : Majeur

Type : Incohérence Spec↔Tests
Référence : spec §4 INV-287-17, §7 (aucun CA), tests §2 « CA N/A »
Description : Invariant non négociable sans critère d'acceptation.
Impact : Risque de passage Gate 8 sans vérification.
Gravité : Majeur

Type : Non testable
Référence : spec §5.2 revocation_effective_latency (« charge nominale »), §7 CA-287-08, tests §9
Description : « Charge nominale » non spécifiée — P95 non comparable entre environnements.
Impact : Critère contractuellement flou.
Gravité : Majeur

Type : Risque sécurité
Référence : spec §5.1 D-287-26 / D-287-27, §4 INV-287-14, §7 CA-287-13, tests TC-NEG-07
Description : Aucun mécanisme d'authenticité du manifeste d'export (signature / ancrage) ; substitution indétectable.
Impact : Vérification offline sans référentiel de confiance.
Gravité : Majeur

Type : Risque sécurité / Non testable
Référence : spec §4 INV-287-13, §5.1 D-287-24, §7 CA-287-16, tests TC-NOM-14
Description : Aucune structure de chaînage / preuve d'intégrité spécifiée pour le journal append-only.
Impact : Immuabilité d'entrées antérieures non testable en boîte noire.
Gravité : Majeur

Type : Ambiguïté
Référence : spec §4 INV-287-20, §5.6
Description : « Obligatoires si concurrence/asynchrone » affaiblit les mécanismes rendus obligatoires inconditionnellement en §5.6.
Impact : Porte d'échappatoire d'implémentation.
Gravité : Majeur

Type : Hypothèse dangereuse / Risque sécurité
Référence : spec §5.2 session_inactivity_timeout_seconds (max 43200 s)
Description : Borne max 12 h admissible sans justification probatoire.
Impact : INV-287-04 affaibli pour des configs admissibles.
Gravité : Majeur

Type : Incohérence Spec↔Tests
Référence : spec §5bis diagramme de séquence, §5.1 (aucun D-287-*)
Description : `recipient_capsule_encrypted_b64` référencé hors modèle de données canonique.
Impact : Format non spécifié pour TC-NOM-07.
Gravité : Majeur

Type : Cohérence des diagrammes / Incohérence Spec↔Tests
Référence : spec §5bis diagramme de séquence, §4 INV-287-04 / INV-287-08, §5.4 F-287-02 / F-287-05, tests TC-NOM-09 / TC-ERR-09 / TC-ERR-10
Description : Diagramme n'inclut ni réauthentification inactivité ni révocation.
Impact : Schéma de référence incomplet pour agents d'implémentation.
Gravité : Majeur

Type : Cohérence des diagrammes
Référence : spec §5bis diagramme d'état, lignes `STATE --> STATE: INTERDITE`
Description : Auto-références rendues comme boucles réelles par Mermaid, contredisent sémantiquement le label « INTERDITE ».
Impact : Risque d'implémentation d'un no-op interdit.
Gravité : Majeur

Type : Ambiguïté / Risque sécurité
Référence : spec §5.1 D-287-03 (regex ≤ 319 vs length ≤ 254)
Description : Conflit numérique entre regex et bornes de longueur sur `recipient_email`.
Impact : Seuil d'acceptation non déterministe.
Gravité : Majeur

Type : Contradiction
Référence : spec §6 ERR-287-14 (503), ERR-287-15 (503), ERR-287-16 (500)
Description : Trois fail-closed même nature, codes HTTP divergents sans justification.
Impact : Incohérence contractuelle / testabilité.
Gravité : Majeur

Type : Ambiguïté
Référence : spec §4 INV-287-16-envelope-encryption
Description : Identifiant non conforme au pattern `INV-287-NN`.
Impact : Tracabilité ID fragile.
Gravité : Mineur

Type : Ambiguïté
Référence : spec §9 H-287-07
Description : Hypothèse méta-process, hors périmètre produit.
Impact : Bruit contractuel.
Gravité : Mineur

Type : Ambiguïté
Référence : spec §7 CA-287-29, §10.1
Description : Conformité stack n'est pas un critère d'acceptation fonctionnel.
Impact : Confusion de périmètre Gate 3 / Gate 5.
Gravité : Mineur

Type : Ambiguïté
Référence : spec §4 INV-287-24, §7 CA-287-26, tests TC-NOM-11
Description : Moment d'affichage de la mention « pas de DRM » non précisé.
Impact : Observable de test faible.
Gravité : Mineur

Type : Non testable
Référence : spec §10.2 Q-287-04, §4 INV-287-15
Description : Politique de rétention absente mais invariant conservé.
Impact : Cohérence §4 ↔ §10.2.
Gravité : Mineur

Type : Ambiguïté
Référence : spec §5.2 otp_max_attempts_per_session
Description : Min = max = 5 figé, configurabilité muette par rapport au format §5.3.
Impact : Configuration non justifiée.
Gravité : Mineur

Type : Ambiguïté
Référence : spec §5.2 open_requests_per_ip_per_min, §3 Définitions
Description : « Open request » non défini au §3.
Impact : Quota peu observable.
Gravité : Mineur

Type : Hypothèse dangereuse
Référence : spec §5.2 idempotency_window_hours (min 1 h)
Description : Borne min 1 h courte pour un retry humain différé.
Impact : Tolérance de réplication faible en MVP.
Gravité : Mineur

Type : Non testable
Référence : tests §3 ST-287-13, §7 CA-287-19
Description : « Compromission » d'un lien non observable sans modèle d'attaque formalisé.
Impact : Scénario interprétable.
Gravité : Mineur

Vérification §5bis — Cohérence des diagrammes

Contrôle Résultat
Diagramme d'état présent Oui
Chaque transition §5.5 apparaît dans le diagramme Oui (y compris retours OTP_BLOCKED -> ACTIVE + terminaux)
Chaque transition du diagramme correspond à un invariant §4 / ligne §5.5 Oui, à l'exception des auto-références rendues INTERDITE (voir M-10)
Diagramme de séquence présent (≥ 2 services + crypto) Oui
Transformations de données explicites (qui hashe / qui signe / format) Oui sur PRE_ReKeyGen / PRE_ReEncrypt, token_raw(32 bytes) -> base64url(43 chars)
Tous les identifiants du diagramme référencent un D-287-* Nonrecipient_capsule_encrypted_b64 absent (voir M-08)
Flux révocation / ré-auth inactivité modélisés Non (voir M-09)

Périmètre explicitement non audité

  • Couverture fonctionnelle des tests (hors périmètre prompt).
  • Suffisance des scénarios adversariaux — seules ambiguïtés / contradictions / risques relevés.
  • Implémentation, stack, contraintes de déploiement au-delà de §10.1.

Artefact produit : PD-287-review-step3-v1.md Chemin : ProbatioVault-backend/docs/epics/sharing/PD-287-lien-partage-sans-compte/PD-287-review-step3-v1.md Aucune correction, reformulation ou implémentation n'est proposée (conformité au prompt §🧾).