Aller au contenu

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.txt et manifest-sha3.txt.
  • Vérification d’intégrité du package via manifestes, avec niveau probatoire standard (sans export.sig) ou strong (avec export.sig HSM).
  • Inclusion des documents soft-deleted avec 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: package standard + 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 REQUESTED ou ASSEMBLING ou READY_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_TIMEOUT est un état distinct de FAILED. Il est émis uniquement quand le worker dépasse export_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_timeout est 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 final FAILED avec failure_reason: PROOF_ENVELOPE_INCOMPLETE).
  • 504 EXPORT_TIMEOUT: dépassement export_job_timeout, état FAILED_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 export GLOBAL
    Then l’export atteint READY_FOR_DOWNLOAD avec package complet et dual manifests.

  • ST-253-02 (Quota concurrence)
    Given un export actif en ASSEMBLING
    When le même utilisateur soumet un nouvel export
    Then la requête est refusée avec 409 EXPORT_ALREADY_ACTIVE.

  • ST-253-03 (Anchor pending)
    Given un document avec blockchain_anchor.status=pending
    When l’export est généré
    Then le document est inclus et son statut exporté est pending.

  • 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 dans destruction-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 erreur 500 AUDIT_WRITE_FAILED est 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 est 410 DOWNLOAD_URL_EXPIRED.

  • ST-253-08 (État terminal)
    Given un export en EXPIRED
    When une tentative de retour en READY_FOR_DOWNLOAD est 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: polling GET export status obligatoire; 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