PD-253 — Export bulk réversible avec métadonnées et preuves probatoires¶
1. Objectif¶
La story PD-253 doit contractualiser un export bulk, auto-porteur et vérifiable offline d’un coffre utilisateur, afin de satisfaire la réversibilité NF Z42-013 §13.1 et la portabilité RGPD Art.20.
Le résultat attendu est un package d’export contenant, selon le périmètre demandé, les documents archivés (chiffrés), leurs métadonnées, leurs preuves d’intégrité, et les manifestes d’intégrité du package, sans dépendance à ProbatioVault pour la vérification de base.
2. Périmètre / Hors périmètre¶
Inclus¶
- Export asynchrone des archives d’un utilisateur selon 4 granularités:
GLOBAL,VAULT,PERIOD,SELECTION. - Inclusion des documents avec leur enveloppe probatoire (
plaintext_hash,ciphertext_hash, preuve Merkle, TSA RFC3161, signature serveur, ancrage blockchain). - Production d’un package BagIt avec double manifeste:
manifest-sha256.txtetmanifest-sha3.txt. - Vérification d’intégrité du package via manifestes, avec niveau probatoire
standard(sansexport.sig) oustrong(avecexport.sigHSM). - Inclusion des documents
soft-deletedavec marquage explicite. - Exclusion des documents détruits légalement, avec traçage dans
destruction-log.json. - Quota anti-abus: 1 export concurrent maximum par utilisateur.
- Audit trail obligatoire et fail-closed.
- Notification de disponibilité + accès par URL signée à durée limitée.
Exclu¶
- Import / restauration dans ProbatioVault.
- Déchiffrement serveur du contenu exporté.
- Streaming temps réel de progression document par document.
- Exports multi-tenant / administrateur inter-utilisateurs.
- Redéfinition du contenu cryptographique produit par PD-282 / PD-39 / PD-37 (PD-253 consomme ces artefacts).
3. Définitions¶
- Réversibilité: capacité à récupérer l’archive complète, lisible et vérifiable sans dépendance fournisseur.
- ProofEnvelope: ensemble probatoire attaché à un document exporté.
plaintext_hash: SHA3-256 du contenu en clair (preuve de contenu).ciphertext_hash: SHA3-256 du contenu chiffré stocké WORM (preuve d’intégrité archive).- BagIt: format de paquetage avec manifests d’intégrité.
- Niveau
standard: package vérifiable via manifests, sans signature HSM du package. - Niveau
strong: packagestandard+ signature HSM (export.sig) du digest package. - Document soft-deleted: document logiquement supprimé, physiquement présent en WORM.
- Document détruit légalement: document non récupérable, destruction tracée (PD-250).
- Export actif: export en état
REQUESTEDouASSEMBLINGouREADY_FOR_DOWNLOAD.
4. Invariants (non négociables)¶
| ID | Règle | Justification |
|---|---|---|
| INV-253-01-exhaustivite | Un export GLOBAL inclut 100% des documents du coffre entrant dans les règles d’inclusion/exclusion; aucun succès partiel silencieux n’est autorisé. | NF Z42-013 §13.1 + E-1 |
| INV-253-02-proof-complete | Chaque document inclus porte une ProofEnvelope complète conforme aux contrats amont. Exception contractuelle : pour les documents dont blockchain_anchor.status = pending, la section blockchain est acceptée avec tx_id: null — la ProofEnvelope est considérée complète au sens de PD-253 (cf. INV-253-08). | O-3 + ISO 14641 |
| INV-253-03-dual-hash | Chaque ProofEnvelope contient plaintext_hash et ciphertext_hash; la chaîne Merkle référence ciphertext_hash. | C-7 |
| INV-253-04-dual-manifest | Le package contient obligatoirement manifest-sha256.txt et manifest-sha3.txt. | C-8 |
| INV-253-05-integrite-package | Toute altération d’un fichier du package rend au moins un manifeste invalide à la vérification. | E-3 |
| INV-253-06-signature-optionnelle | L’absence de export.sig n’invalide pas la réversibilité (standard), sa présence qualifie un niveau strong. | C-9 |
| INV-253-07-quota-concurrence | Maximum 1 export actif par utilisateur; toute nouvelle demande active est refusée (409 EXPORT_ALREADY_ACTIVE). | C-10 + E-8 |
| INV-253-08-pending-anchor | Les documents à ancrage blockchain pending sont inclus avec statut explicite pending. | C-11 |
| INV-253-09-deleted-destruction | Soft-deleted inclus avec métadonnées de suppression; documents détruits légalement exclus et consignés dans destruction-log.json. | C-12 |
| INV-253-10-audit-fail-closed | Si l’écriture audit échoue, la création d’export est refusée (pas de catch-absorb). | E-7 |
| INV-253-11-envelope-encryption | Tout artefact cryptographique temporaire (clé, fragment, DEK, ReKey, package temporaire) est chiffré au repos; aucun secret en clair persistant. | Invariant crypto obligatoire |
| INV-253-12-no-residuals | À la fin (succès/échec/crash), aucun fichier temporaire non requis ne persiste au-delà de la fenêtre de rétention contractualisée. | E-6 |
| INV-253-13-transitions | Les transitions d’état autorisées/interdites sont explicites pour chaque état; tout état terminal interdit toute sortie (→ * : INTERDITE). | Exigence machine à états |
| INV-253-14-atomicite-sync-async | Commit DB et opérations async sont contractuellement séparés: DB ACID synchrone, post-traitements async idempotents et rattrapables. | Exigence atomicité multi-composant |
5. Flux nominaux¶
5.1 Modèle de données contractuel (formats et contraintes)¶
| Donnée | Format / encodage | Taille | Caractères | Sensibilité casse | Regex / règle | Invalide |
|---|---|---|---|---|---|---|
export_id | UUID v4 texte | 36 chars | [0-9a-f-] | insensitive (hex) | ^[0-9a-fA-F]{8}-...{12}$ | 400 |
user_id | UUID v4 texte | 36 chars | [0-9a-f-] | insensitive | idem UUID v4 | 401/403/400 |
vault_id | UUID v4 texte | 36 chars | [0-9a-f-] | insensitive | idem UUID v4 | 400 |
document_id | UUID v4 texte | 36 chars | [0-9a-f-] | insensitive | idem UUID v4 | 400 |
scope | Enum | 1 valeur | ASCII upper + _ | sensitive | GLOBAL|VAULT|PERIOD|SELECTION | 400 |
from / to | RFC3339 UTC | 20–35 chars | UTF-8 | sensitive | date valide, from <= to | 400 |
plaintext_hash | hex SHA3-256 | 64 chars | [a-f0-9] | sensitive | ^[a-f0-9]{64}$ | doc marqué invalide, export FAILED |
ciphertext_hash | hex SHA3-256 | 64 chars | [a-f0-9] | sensitive | ^[a-f0-9]{64}$ | doc marqué invalide, export FAILED |
merkle_root | hex SHA3-256 | 64 chars | [a-f0-9] | sensitive | ^[a-f0-9]{64}$ | export FAILED |
blockchain_anchor.status | Enum | 1 valeur | ASCII lower | sensitive | pending|anchored|failed | FAILED si hors enum |
destruction_log[].destruction_act_hash | hex SHA3-256 | 64 chars | [a-f0-9] | sensitive | ^[a-f0-9]{64}$ | export FAILED |
manifest-sha256.txt ligne | <hex><2 spaces><path> | digest 64 chars | ASCII printable | sensitive | SHA-256 + chemin relatif | package invalide |
manifest-sha3.txt ligne | <hex><2 spaces><path> | digest 64 chars | ASCII printable | sensitive | SHA3-256 + chemin relatif | package invalide |
Règles complémentaires: - Tous les JSON d’export sont encodés en UTF-8, sans BOM. - Les chemins de fichiers dans manifests sont relatifs au package, séparateur /, sans ... - Les formats cryptographiques détaillés fournis par modules amont (ex. structure interne TSA/signature) sont hors périmètre PD-253 et consommés comme contrats externes.
5.2 Paramètres numériques contractualisés¶
| Paramètre | Défaut | Min | Max | Unité | Contexte | Percentile | Hors bornes |
|---|---|---|---|---|---|---|---|
| Exports actifs / utilisateur | 1 | 1 | 1 | export | runtime backend | n/a | rejet 409 |
| Taille max package | 100 | 1 | 100 | GB | stockage staging | n/a | rejet 413 |
| TTL URL signée téléchargement | 24 | 1 | 72 | h | accès utilisateur | n/a | clamp min/max config |
| Rétention package prêt | 168 | 24 | 720 | h | staging S3 | n/a | clamp min/max config |
| Timeout job export | 24 | 1 | 72 | h | worker export | P95 respecté | FAILED_TIMEOUT |
| Dégradation max API métier hors export | +20 | 0 | 20 | % P95 latence | cluster référence prod nominale | P95 | si >20%: non conforme |
5.3 SLA temporels¶
| SLA | Défaut | Min | Max | Configurabilité | Expiration |
|---|---|---|---|---|---|
download_url_ttl | 24h | 1h | 72h | oui (config env) | URL invalide, régénération requise |
package_retention_ttl | 7j | 24h | 30j | oui (config env) | état EXPIRED, package purgé |
export_job_timeout | 24h | 1h | 72h | oui (config env) | état FAILED_TIMEOUT |
5.4 Machine à états (transitions explicites)¶
États: REQUESTED, ASSEMBLING, READY_FOR_DOWNLOAD, DOWNLOADED, EXPIRED, FAILED, FAILED_TIMEOUT, CANCELLED.
Note v2 :
FAILED_TIMEOUTest un état distinct deFAILED. Il est émis uniquement quand le worker dépasseexport_job_timeout. Utilité : distinguer les timeouts (infrastructure) des échecs fonctionnels (ProofEnvelope invalide, etc.) dans les métriques et le monitoring.
REQUESTED- Autorisées:
REQUESTED -> ASSEMBLING,REQUESTED -> CANCELLED - Interdites: toutes autres.
ASSEMBLING- Autorisées:
ASSEMBLING -> READY_FOR_DOWNLOAD,ASSEMBLING -> FAILED,ASSEMBLING -> FAILED_TIMEOUT,ASSEMBLING -> CANCELLED - Interdites: retour vers
REQUESTED, toute autre. READY_FOR_DOWNLOAD- Autorisées:
READY_FOR_DOWNLOAD -> DOWNLOADED,READY_FOR_DOWNLOAD -> EXPIRED - Interdites: retour vers états précédents, toute autre.
DOWNLOADED(terminal fonctionnel)DOWNLOADED -> * : INTERDITE (état terminal, résolution manuelle uniquement).EXPIRED(terminal)EXPIRED -> * : INTERDITE (état terminal, résolution manuelle uniquement).FAILED(terminal)FAILED -> * : INTERDITE (état terminal, résolution manuelle uniquement).FAILED_TIMEOUT(terminal — timeout infrastructure)FAILED_TIMEOUT -> * : INTERDITE (état terminal, résolution manuelle uniquement).- Émis uniquement par le worker quand
export_job_timeoutest dépassé. CANCELLED(terminal)CANCELLED -> * : INTERDITE (état terminal, résolution manuelle uniquement).
Transitions retour: - READY_FOR_DOWNLOAD -> ASSEMBLING: INTERDITE (immutabilité package prêt). - EXPIRED/FAILED/CANCELLED/DOWNLOADED -> état actif: INTERDITE (nouvelle demande d’export requise).
5.5 Flux nominaux¶
1) Création d’export - Entrée valide (scope + filtres). - Vérification quota (1 actif max); si actif, rejet 409. - Écriture audit obligatoire. - Création état REQUESTED.
2) Assemblage asynchrone - Passage ASSEMBLING. - Sélection du périmètre selon scope. - Inclusion documents + métadonnées + ProofEnvelope. - Application règles soft-deleted / destroyed. - Génération package BagIt + dual manifest. - Signature HSM package optionnelle. - Passage READY_FOR_DOWNLOAD.
3) Téléchargement - Génération URL signée TTL. - Téléchargement utilisateur. - Passage DOWNLOADED à confirmation de téléchargement réussi.
4) Annulation - Endpoint: DELETE /exports/{export_id}. - Autorisé uniquement si l'export est en état REQUESTED ou ASSEMBLING. - Seul l'utilisateur propriétaire de l'export peut déclencher l'annulation (vérification user_id obligatoire). - En état ASSEMBLING: le worker en cours est notifié; si le worker n'est pas encore terminé, la demande est honorée au prochain checkpoint; si le worker a déjà produit le package, le passage à CANCELLED est refusé (idempotence: l'état READY_FOR_DOWNLOAD est conservé). - Transition: REQUESTED → CANCELLED ou ASSEMBLING → CANCELLED. - Toute tentative d'annulation sur un état terminal renvoie 409 EXPORT_NOT_CANCELLABLE. - Trace d'audit émise au même titre que la création (fail-closed).
5) Expiration / purge - Si non téléchargé avant TTL: EXPIRED. - Purge package staging à expiration retention. - Aucune donnée temporaire résiduelle hors règles de rétention.
5.6 Atomicité multi-composant¶
| Scope | Synchrone/Async | Garantie |
|---|---|---|
| Création enregistrement export + audit initial | Synchrone (transaction DB) | ACID, fail-closed |
| Assemblage package | Async post-commit | Idempotent, retry-safe |
| Publication disponibilité / notification | Async post-commit | Retry-safe |
| Crash pré-commit | — | rollback complet |
| Crash post-commit / pré-async | — | DB cohérente, rattrapage via worker |
5.7 Contraintes inter-modules¶
| Élément | Contrat |
|---|---|
| Modules cibles | legal-compliance (export) + documents + crypto-proof + audit |
| Données externes requises | métadonnées documents, ProofEnvelope, statut destruction légale, événements audit |
| Résolution inter-modules | association document_id unique entre module documents et preuves |
| Scope de contrôle | contrôles d’accès appliqués au périmètre de l’utilisateur propriétaire uniquement |
| Exceptions d’accès | aucune exception admin/inter-tenant dans PD-253 |
Accès status (GET /exports/{id}) | Vérifié : export.user_id == token.user_id. Sinon: 403 FORBIDDEN_EXPORT_ACCESS. |
| Accès téléchargement (URL signée) | L’URL signée est émise pour l’utilisateur propriétaire; validation du token propriétaire avant génération de l’URL. Sinon: 403 FORBIDDEN_EXPORT_ACCESS. |
Annulation (DELETE /exports/{id}) | Vérifié : export.user_id == token.user_id. Sinon: 403 FORBIDDEN_EXPORT_ACCESS. |
5.8 Migration DDL¶
Aucune modification de colonne existante n’est identifiée dans PD-253. Stratégie DDL: non applicable (aucune migration contractualisée).
5.9 Diagrammes Mermaid¶
5.9.1 Machine a etats — cycle de vie d’un export (INV-253-13)¶
stateDiagram-v2
[*] --> REQUESTED : POST /exports\n[INV-253-07 quota verifie]\n[INV-253-10 audit OK]
REQUESTED --> ASSEMBLING : Worker demarre
REQUESTED --> CANCELLED : DELETE /exports/{id}
ASSEMBLING --> READY_FOR_DOWNLOAD : Package BagIt complet\n[INV-253-04 dual manifest]\n[INV-253-01 exhaustivite]
ASSEMBLING --> FAILED : Erreur fonctionnelle\n(ProofEnvelope invalide, etc.)
ASSEMBLING --> FAILED_TIMEOUT : export_job_timeout depasse
ASSEMBLING --> CANCELLED : DELETE /exports/{id}\n(checkpoint worker)
READY_FOR_DOWNLOAD --> DOWNLOADED : Telechargement confirme
READY_FOR_DOWNLOAD --> EXPIRED : package_retention_ttl depasse
DOWNLOADED --> [*] : Terminal\n[INV-253-12 no residuals]
EXPIRED --> [*] : Terminal — package purge\n[INV-253-12 no residuals]
FAILED --> [*] : Terminal
FAILED_TIMEOUT --> [*] : Terminal
CANCELLED --> [*] : Terminal\n[INV-253-12 no residuals]
note right of DOWNLOADED : Etat terminal —\ntoute sortie INTERDITE
note right of EXPIRED : Etat terminal —\ntoute sortie INTERDITE
note left of FAILED : Etat terminal —\ntoute sortie INTERDITE
note left of FAILED_TIMEOUT : Etat terminal —\ntoute sortie INTERDITE
note left of CANCELLED : Etat terminal —\ntoute sortie INTERDITE 5.9.2 Flux nominal — creation et assemblage d’export (sequence multi-services)¶
sequenceDiagram
participant U as Utilisateur
participant API as API Backend
participant DB as PostgreSQL
participant Audit as Service Audit
participant W as Worker Export
participant Docs as Module Documents
participant Crypto as Module Crypto-Proof
participant S3 as Staging S3
participant HSM as HSM (optionnel)
participant Notif as Notification
rect rgb(230, 245, 255)
note right of U: Phase 1 — Creation synchrone [INV-253-14 ACID]
U->>API: POST /exports {scope, filtres}
API->>DB: Verifier quota (1 actif max) [INV-253-07]
DB-->>API: OK / 409 EXPORT_ALREADY_ACTIVE
API->>Audit: Ecrire evenement creation [INV-253-10 fail-closed]
alt Audit echoue
Audit-->>API: Erreur
API-->>U: 500 AUDIT_WRITE_FAILED (aucun export cree)
end
Audit-->>API: OK
API->>DB: INSERT export (REQUESTED) — commit ACID
DB-->>API: export_id
API-->>U: 202 {export_id, status: REQUESTED}
end
rect rgb(245, 255, 230)
note right of W: Phase 2 — Assemblage asynchrone [INV-253-14 idempotent]
API-)W: Job async (post-commit)
W->>DB: Transition REQUESTED -> ASSEMBLING
W->>Docs: Charger documents perimetre [INV-253-01 exhaustivite]
Docs-->>W: Documents + metadonnees (incl. soft-deleted)
W->>Crypto: Charger ProofEnvelopes [INV-253-02 proof complete]
Crypto-->>W: plaintext_hash + ciphertext_hash + Merkle + TSA + signature [INV-253-03 dual hash]
W->>W: Appliquer regles inclusion/exclusion [INV-253-09]
W->>W: Generer destruction-log.json (documents detruits) [INV-253-09]
W->>W: Assembler package BagIt
W->>W: Generer manifest-sha256.txt + manifest-sha3.txt [INV-253-04 dual manifest]
end
rect rgb(255, 245, 230)
note right of W: Phase 2b — Signature optionnelle [INV-253-06]
opt Niveau strong demande
W->>HSM: Signer digest SHA3-256 du package
HSM-->>W: export.sig
W->>W: Inclure export.sig dans le package
end
end
rect rgb(240, 240, 255)
note right of W: Phase 3 — Publication
W->>S3: Upload package staging [INV-253-05 integrite]
S3-->>W: OK
W->>DB: Transition ASSEMBLING -> READY_FOR_DOWNLOAD
W-)Notif: Notifier disponibilite
end
rect rgb(255, 240, 240)
note right of U: Phase 4 — Telechargement
U->>API: GET /exports/{id}
API->>DB: Verifier user_id == token.user_id
API-->>U: {status: READY_FOR_DOWNLOAD, download_url}
U->>S3: Telecharger via URL signee (TTL) [INV-253-05]
S3-->>U: Package BagIt complet
API->>DB: Transition READY_FOR_DOWNLOAD -> DOWNLOADED
end 5.9.3 Flux d’annulation et expiration¶
sequenceDiagram
participant U as Utilisateur
participant API as API Backend
participant DB as PostgreSQL
participant Audit as Service Audit
participant W as Worker Export
participant S3 as Staging S3
participant Cron as Cron Purge
rect rgb(255, 245, 245)
note right of U: Annulation par l’utilisateur
U->>API: DELETE /exports/{id}
API->>DB: Verifier etat (REQUESTED ou ASSEMBLING uniquement)
alt Etat terminal
DB-->>API: Etat terminal
API-->>U: 409 EXPORT_NOT_CANCELLABLE
end
API->>Audit: Ecrire evenement annulation [INV-253-10 fail-closed]
Audit-->>API: OK
API->>DB: Transition -> CANCELLED [INV-253-13]
API-)W: Notifier arret (si ASSEMBLING)
API->>S3: Purger fichiers temporaires [INV-253-12 no residuals]
API-->>U: 200 {status: CANCELLED}
end
rect rgb(245, 245, 255)
note right of Cron: Expiration automatique
Cron->>DB: Detecter exports READY_FOR_DOWNLOAD > package_retention_ttl
DB-->>Cron: Liste exports expires
Cron->>DB: Transition -> EXPIRED [INV-253-13]
Cron->>S3: Purger package staging [INV-253-12 no residuals]
Cron->>Audit: Ecrire evenement expiration [INV-253-10]
end 6. Cas d’erreur¶
400 INVALID_SCOPE_OR_FILTER: périmètre invalide, UUID/date/enum invalides.401 UNAUTHENTICATED: utilisateur non authentifié.403 FORBIDDEN_SCOPE: tentative d’export hors coffre utilisateur.403 FORBIDDEN_EXPORT_ACCESS: accès à un export appartenant à un autre utilisateur (GET status, download URL, DELETE annulation).409 EXPORT_ALREADY_ACTIVE: export actif déjà présent pour l’utilisateur.409 EXPORT_NOT_CANCELLABLE: tentative d’annulation sur un export en état terminal.413 EXPORT_SIZE_LIMIT_EXCEEDED: estimation > limite max.500 AUDIT_WRITE_FAILED: échec audit, création refusée (fail-closed).500 PACKAGE_ASSEMBLY_FAILED: échec technique assemblage. Inclut les cas de ProofEnvelope invalide ou absente (détection asynchrone, état finalFAILEDavecfailure_reason: PROOF_ENVELOPE_INCOMPLETE).504 EXPORT_TIMEOUT: dépassementexport_job_timeout, étatFAILED_TIMEOUT.410 DOWNLOAD_URL_EXPIRED: URL signée expirée.410 EXPORT_EXPIRED: package purgé après retention TTL.
7. Critères d’acceptation (testables)¶
| ID | Critère | Observable |
|---|---|---|
| CA-253-01 | Un export GLOBAL inclut tous les documents éligibles sans omission silencieuse. | Comptage source vs package + état succès uniquement si égalité |
| CA-253-02 | Chaque document exporté contient plaintext_hash et ciphertext_hash valides SHA3-256. | Validation regex + recalcul vérification |
| CA-253-03 | Le package contient les deux manifests obligatoires. | Présence de manifest-sha256.txt et manifest-sha3.txt |
| CA-253-04 | L’altération d’un fichier export est détectée à la vérification. | Vérification manifeste échoue |
| CA-253-05 | Un second export actif pour le même utilisateur est refusé. | Réponse 409 EXPORT_ALREADY_ACTIVE |
| CA-253-06 | Un document blockchain_anchor.status=pending est exporté avec ce statut inchangé. | Lecture metadata exportée |
| CA-253-07 | Soft-deleted inclus et marqués; détruits légalement exclus et tracés dans destruction-log.json. | Inspection package |
| CA-253-08 | Si l’audit échoue à la création, aucun export n’est créé. | Pas d’export_id, erreur 500 AUDIT_WRITE_FAILED |
| CA-253-09 | À expiration TTL de package, l’état passe EXPIRED et le package est purgé. | État + absence objet staging |
| CA-253-10 | La machine à états interdit toute sortie des états terminaux. | Tentatives de transition rejetées |
| CA-253-11 | Un package sans export.sig reste valide en niveau standard. | Vérification manifests réussie sans signature HSM |
| CA-253-12 | Dégradation de latence P95 API métier sous charge export reste <= 20%. | Mesure de perf environnement de référence |
8. Scénarios de test (Given / When / Then)¶
-
ST-253-01 (Global nominal)
Given un utilisateur avec documents actifs/soft-deleted et preuves valides
When il demande un exportGLOBAL
Then l’export atteintREADY_FOR_DOWNLOADavec package complet et dual manifests. -
ST-253-02 (Quota concurrence)
Given un export actif enASSEMBLING
When le même utilisateur soumet un nouvel export
Then la requête est refusée avec409 EXPORT_ALREADY_ACTIVE. -
ST-253-03 (Anchor pending)
Given un document avecblockchain_anchor.status=pending
When l’export est généré
Then le document est inclus et son statut exporté estpending. -
ST-253-04 (Destruction légale)
Given un document marqué détruit via PD-250
When l’export est généré
Then le document n’est pas dans le package principal et apparaît dansdestruction-log.json. -
ST-253-05 (Corruption détectée)
Given un package d’export valide
When un fichier payload est modifié après génération
Then la vérification d’intégrité manifeste échoue. -
ST-253-06 (Audit fail-closed)
Given une panne du service d’audit
When l’utilisateur demande un export
Then aucun export n’est créé et une erreur500 AUDIT_WRITE_FAILEDest renvoyée. -
ST-253-07 (Expiration URL)
Given un export prêt avec URL signée expirée
When l’utilisateur tente le téléchargement
Then la réponse est410 DOWNLOAD_URL_EXPIRED. -
ST-253-08 (État terminal)
Given un export enEXPIRED
When une tentative de retour enREADY_FOR_DOWNLOADest effectuée
Then la transition est refusée (état terminal).
9. Hypothèses explicites¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H-253-01 | Les modules amont fournissent des ProofEnvelopes contractuellement valides et complets. | Exports échouent en état FAILED avec failure_reason: PROOF_ENVELOPE_INCOMPLETE, conformité dégradée |
| H-253-02 | Le stockage staging supporte des objets jusqu’à 100 GB par export. | Limite taille à revoir, risque non-conformité volumétrique |
| H-253-03 | Le mécanisme d’URL signée supporte TTL configurable entre 1h et 72h. | Risque sécurité/usabilité (T-5) |
| H-253-04 | Les métriques de performance P95 sont disponibles en environnement de référence. | Critère CA-253-12 non vérifiable |
| H-253-05 | Le mapping des statuts de destruction légale est accessible au module export. | Risque d’inclusion/exclusion incorrecte |
| H-253-06 | La signature HSM package peut être indisponible sans bloquer la réversibilité. | Seul niveau standard disponible |
10. Points à clarifier¶
10.1 Contraintes techniques (stack réelle projet cible)¶
- Projet cible: ProbatioVault-backend
- Stack contractuelle: NestJS + TypeORM + PostgreSQL
- Exécution asynchrone: workers/queue backend existants du projet (sans imposer d’implémentation spécifique)
- Format d’artefact: package BagIt conforme RFC 8493 + extensions probatoires ProbatioVault
10.2 Clarifications ouvertes¶
- PC-253-01 (Q-2): périmètre exact signé par
export.sig
Option contractuelle retenue provisoire: signature du digest SHA3-256 du package final; confirmation attendue sécurité/crypto. - PC-253-02 (Q-3): politique de purge post-téléchargement
Valeur actuelle: retention TTL indépendante du téléchargement; confirmer suppression anticipée si téléchargement confirmé. - PC-253-03 (Q-5): canal de notification
Contrat minimal: pollingGET export statusobligatoire; confirmer ajout email/push. - PC-253-04: format contractuel détaillé des objets blockchain (
tx_id,network, preuves) selon chaîne cible. - PC-253-05: politique de reprise utilisateur après
FAILED_TIMEOUT(relance automatique ou manuelle uniquement).
Références¶
- Epic : PD-217 — LEGAL & COMPLIANCE
- JIRA : PD-253
- Repos concernés : backend
- Documents associés : PD-244 (audit normatif), PD-85, PD-282, PD-39, PD-37, PD-250, PD-283, NF Z42-013:2020 §13.1, ISO 14641, RGPD Art.20