Aller au contenu

PD-80 — Implémenter scellement instantané (P95 < 15 min)

1. Contexte

ProbatioVault est un coffre-fort numérique à valeur probante. Dans le cadre de l'offre B2C-mineurs (cyberharcèlement, revenge porn, menaces, diffusion rapide de contenu), la rapidité du scellement probatoire est critique. Aujourd'hui, l'ancrage blockchain fonctionne en batch standard avec un SLA de plusieurs heures. Cette story introduit un mécanisme de scellement prioritaire garantissant une preuve juridiquement complète en P95 < 15 minutes (pire-cas < 25 min sans dégradation externe, < 75 min avec retries TSA/blockchain).

Argument différenciant : Aucun concurrent coffre-fort numérique ne propose aujourd'hui un scellement probatoire complet (TSA + blockchain) en moins d'une heure.

2. Problème

Un mineur victime de cyberharcèlement uploade une capture d'écran comme preuve. Avec le système batch standard, l'ancrage blockchain peut prendre plusieurs heures. Pendant ce délai : - Le contenu peut être supprimé par l'auteur - L'urgence judiciaire (dépôt de plainte, référé) n'est pas servie - La preuve existe localement (hash + journal append-only) mais n'a pas encore de valeur probante complète (TSA + blockchain)

3. Objectif

Permettre à un mineur (ou à son représentant légal) de sceller probatoirement une preuve numérique en moins d'une heure, avec : - Horodatage qualifié RFC 3161 (TSA) - Inclusion Merkle (mini-batch prioritaire) - Signature HSM - Ancrage blockchain L2 - Génération de la preuve vérifiable - Notification multi-canal

4. Acteurs

Acteur Rôle
Mineur (ou représentant légal) Uploade la preuve, reçoit la notification de scellement
Utilisateur standard (premium) Déclenche manuellement le scellement urgent via bouton
Worker TSA prioritaire Traite les demandes TSA fast-track
Worker ancrage prioritaire Traite les mini-batches Merkle prioritaires
Système de notification Push mobile + email + webhook

5. Règles métier

5.1 Mode de déclenchement (hybride)

Condition Comportement
account.type == minor Fast-track automatique (aucune friction UX)
Utilisateur clique "Scellement urgent" Fast-track manuel
Sinon Batch standard

5.2 SLA global (chaîne complète)

Le SLA couvre l'intégralité de la chaîne probatoire, mesurée à 3 niveaux :

Étape SLA cible (P50) SLA nominal (P95) SLA max (pire-cas)
Upload + hash < 1 sec < 5 sec 30 sec
TSA RFC 3161 < 5 sec < 1 min 10 min (1 retry)
Batch wait (accumulation mini-batch) < 2 min < 5 min 5 min
Merkle build + TX submission < 5 sec < 30 sec 60 sec
Finality blockchain L2 (Polygon 12 blocs) < 30 sec < 2 min 15 min (timeout)
Proof package (génération preuve) immédiat < 5 sec 1 min
Notification immédiat < 5 sec 1 min
Total ~3-4 min < 15 min ~25 min

Note : En cas de dégradation externe (indisponibilité TSA : 4 retries [1,5,15,30] min = 51 min, ou congestion blockchain : finality timeout 15 min), le pire-cas absolu atteint ~75 min. Le final_timeout à 120 min couvre ce scénario avec marge. Le SLA engagé reste P95 < 15 min sur fenêtre glissante 24h.

5.3 Mini-batch prioritaire (pas d'ancrage individuel)

Paramètre Valeur
batch_size_max 20
batch_time_max 5 min

Un Merkle batch de 5–20 preuves produit 1 transaction blockchain pour N preuves vérifiables. L'utilisateur ne voit aucune différence avec un ancrage individuel.

5.4 Dégradation (fail-soft)

Si TSA ou blockchain temporairement indisponible : - Jamais d'échec immédiat — file d'attente avec retry - Politique retry (exponential backoff) :

Retry Délai
1 1 min
2 5 min
3 15 min
4 30 min
  • Timeout final : > 2h → notification d'échec + escalade opérationnelle
  • Le hash local + journal append-only garantissent déjà une preuve de capture, même sans ancrage blockchain

5.5 Quotas et anti-abus

Plan Fast-track / mois Tarification
Freemium 3 pay-per-use (0,99 €/scellement)
Premium 10 inclus
Entreprise illimité inclus
  • Rate limit : 1 scellement urgent / heure / utilisateur
  • Protection anti-DoS économique (flood blockchain)

5.6 Notifications (triple canal)

Canal Usage Contenu
Push mobile Principal, instantané Hash, statut, horodatage
Email Preuve officielle (avocat, police, parents) Hash document, tx blockchain, lien téléchargement preuve, horodatage TSA
Webhook B2B / intégrations (si configuré) POST /webhooks/proof_sealed avec payload {document_id, hash, tsa_time, blockchain_tx, status}

5.7 UX progression

Après upload urgent :

🔒 Capture de preuve effectuée
⏱ Horodatage certifié : en cours
⛓ Ancrage blockchain : en cours
Temps estimé : quelques minutes

Puis :

✅ Preuve scellée
Horodatage : 14:32
Blockchain : confirmée

Détails techniques (accès avancé via bouton) : hash document, Merkle proof, transaction blockchain avec lien explorateur.

6. Architecture cible

6.1 Queues BullMQ

Queue Workers Usage
priority_tsa worker_tsa_priority Horodatage TSA fast-track
priority_anchor worker_anchor_priority Ancrage blockchain fast-track
standard_anchor worker_anchor_standard Batch standard (existant)

Politique de priorité : priority weight = 5, standard weight = 1. Pas de starvation des batchs standards.

6.2 Métriques

Métrique Description
seal_latency_seconds Latence totale upload → preuve scellée
priority_queue_depth Profondeur de la file prioritaire
tsa_latency_seconds Latence TSA
anchor_latency_seconds Latence ancrage blockchain

7. Périmètre et exclusions

Inclus (cette story)

  • Queues BullMQ prioritaires (TSA + anchor)
  • Workers prioritaires
  • Mini-batch Merkle prioritaire
  • Dégradation fail-soft avec retry
  • Quotas et rate limiting
  • Notifications push + email + webhook
  • Métriques de latence

Exclus (stories séparées)

  • UX front-end : composants visuels (bouton "Scellement urgent", carte de progression, détails techniques) → PD-284 (créée, bloquée par PD-80)
  • Facturation pay-per-use (intégration Stripe)
  • Dashboard opérationnel de monitoring des queues prioritaires

8. Dépendances

Dépendance Story Statut
Worker ancrage blockchain PD-55 DONE
TSA RFC 3161 PD-39 DONE
HSM signature PD-37 DONE
Merkle tree PD-54 DONE
BullMQ configuration PD-21 DONE
Session management Redis PD-30 DONE
Notification push mobile PD-105 DONE

9. Critères d'acceptation (haut niveau)

  • CA-01 : Un compte mineur qui uploade un document déclenche automatiquement le fast-track (pas de clic supplémentaire)
  • CA-02 : Un utilisateur standard peut déclencher manuellement le scellement urgent (bouton API)
  • CA-03 : Le SLA global P95 < 15 min est respecté (TSA + batch + Merkle + blockchain finality + proof + notification). Pire-cas sans dégradation externe < 25 min. Timeout final à 120 min.
  • CA-04 : Le mini-batch prioritaire regroupe 5–20 preuves avec un batch_time_max de 5 min
  • CA-05 : En cas d'indisponibilité TSA/blockchain, le retry exponential backoff est appliqué (1min, 5min, 15min, 30min)
  • CA-06 : Le timeout final > 2h déclenche une notification d'échec + escalade
  • CA-07 : Les quotas sont respectés (freemium: 3/mois, premium: 10/mois, enterprise: illimité)
  • CA-08 : Le rate limiting 1/heure/utilisateur est appliqué
  • CA-09 : La notification push mobile est envoyée immédiatement après scellement
  • CA-10 : L'email de preuve officielle contient hash, tx blockchain, lien téléchargement, horodatage TSA
  • CA-11 : Le webhook proof_sealed est émis si configuré
  • CA-12 : Les métriques seal_latency_seconds et priority_queue_depth sont exposées
  • CA-13 : La file prioritaire ne provoque pas de starvation du batch standard (weight 5:1)

10. Learnings injectés

Source Learning Impact sur cette story
PD-55 Gate 3 blockchain/crypto nécessite formalisme RFC (canonicalisation, formats preuve) Formaliser les formats preuve et canonicalisation dans la spec
PD-81 Chaque transition temporelle DOIT avoir SLA min/max/default SLA détaillé par étape (§5.2) avec bornes min/cible/max
BATCH-RETRO Pattern transaction englobante + advisory lock pour atomicité probatoire Appliquer DataSource.transaction() pour audit + preuve + persistance