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 |
| 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 :
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_maxde 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_sealedest émis si configuré - CA-12 : Les métriques
seal_latency_secondsetpriority_queue_depthsont 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 |