Aller au contenu

PD-278 — Expression de besoin

1. Titre

NF Z42-013 : implémenter l'état DIP (Dissemination Information Package)

2. Contexte

L'audit formel NF Z42-013 (PD-244, 2026-03-01) a révélé un FAIL TLA+ sur l'invariant AnchorAssume_States (ligne 22 du modèle _AnchoredFacts_NF.tla). Le modèle TLA+ déclare 4 états OAIS conformes à la norme NF Z42-013:2020 :

DocStates == {"SIP", "AIP", "DIP", "ELIMINATED"}

Le code TypeScript (DocumentStatus enum) n'implémente que 3 états :

État NF Z42-013 État Code actuel Mapping
SIP (Submission Information Package) PENDING Acquisition (~60 min)
AIP (Archival Information Package) SEALED Conservation probatoire WORM
DIP (Dissemination Information Package) ABSENT Non implémenté
ELIMINATED EXPIRED Rétention expirée

L'absence de DIP viole : - NF Z42-013:2020 §7.6 — Communication : le SAE doit produire un DIP à partir de l'AIP - ISO 14721 (OAIS) — Le cycle de vie OAIS impose 4 états - L'ASSUME TLA+DocStates ⊆ RealStates échoue au model checking

3. Besoin fonctionnel

En tant que responsable d'archivage (PA) ou auditeur, je veux pouvoir demander la communication d'un ou plusieurs documents archivés sous forme de package DIP, afin de consulter, exporter ou transmettre des documents tout en maintenant la traçabilité probatoire complète.

4. Périmètre

4.1 Ajout de l'état DIP

  • Ajouter DIP = 'DIP' à l'enum DocumentStatus dans document-secure.entity.ts
  • Nom aligné OAIS (pas "DISSEMINATED") — décision PO pour cohérence normative et auditabilité juridique

4.2 Transitions d'état

Deux transitions à implémenter, conformes au modèle TLA+ existant :

Transition 1 : SEALED → DIP (CommunicateAIP) - Garde : copies >= MIN_COPIES (INV-05 — copies géo-distantes) - Garde : acteur authentifié ∈ {PA, SA, auditor} (§7.3) - Effet : enregistrer disseminated_at, disseminated_by - Effet : générer attestation de restitution (§4.6.4.2) - Journalisation obligatoire (§10.1)

Transition 2 : DIP → SEALED (ReturnDIP) - Transition explicite uniquement — pas de timeout automatique - Décision PO : un timeout créerait une ambiguïté probatoire - Effet : enregistrer dissemination_returned_at - Journalisation obligatoire (§10.1)

4.3 DIP multi-documents (package)

Le DIP doit pouvoir être un package multi-documents : - Cas judiciaire (dossier complet) - Export audit - Transmission RH (paquet annuel) - Dossier mineur vers autorité

Cohérent avec l'architecture ProbatioVault : - Preuve Composite Ancrée (Brevet 2) — multi-événements - Legal PRE (Brevet 1) — encapsulation multi-éléments - Co-détention / enveloppe partagée (Brevet 3)

4.4 Champs additionnels

Champ Type Nullable Description
disseminated_at timestamp oui Date/heure de mise en DIP
disseminated_by uuid (FK user) oui Utilisateur ayant demandé la communication
dissemination_returned_at timestamp oui Date/heure de retour à SEALED
dissemination_package_id uuid oui ID du package DIP (si multi-documents)

4.5 Attestation de restitution

Conformément à NF Z42-013 §4.6.4.2, chaque transition vers DIP génère une attestation : - Identifiant unique de l'attestation - Référence au(x) document(s) source(s) AIP - Identité du demandeur - Date et heure - Motif de la communication (optionnel mais recommandé) - Ancrage dans la chaîne d'audit

4.6 Journalisation

Toute opération DIP est journalisée dans l'audit log existant (§10.1) : - Événement DOCUMENT_DISSEMINATED : transition SEALED → DIP - Événement DOCUMENT_RETURNED : transition DIP → SEALED - Métadonnées : document_id, actor_id, package_id, timestamp

4.7 Correction TLA+ ASSUME

Après implémentation, l'ASSUME DocStates ⊆ RealStates doit passer : - Le mapping code → modèle doit inclure DIP → DIP - Le model checker TLC ne doit plus signaler de violation

5. Hors périmètre

  • Refactoring des états existants (PENDING, SEALED, EXPIRED) — stories séparées
  • Bordereau de destruction (GAP-NF-008 — PD séparée)
  • DIP vers stockage externe (S3 pre-signed URL) — déjà couvert par l'existant
  • Gestion du format de package DIP (SEDA, METS) — story future si nécessaire

6. Contraintes

  • NF Z42-013:2020 (pas 2009) — learning PD-244
  • SLA temporels : chaque transition doit avoir des SLA min/max documentés (learning PD-81)
  • Modèle formel first : le modèle TLA+ fait référence, le code doit s'y conformer
  • RLS : l'accès DIP respecte les règles de sécurité row-level existantes
  • WORM : le document sous-jacent reste WORM même en état DIP — seul le statut de visibilité change

7. Critères d'acceptation préliminaires

  1. L'enum DocumentStatus contient 4 valeurs : PENDING, SEALED, DIP, EXPIRED
  2. Un endpoint permet de transitionner un document SEALED → DIP
  3. Un endpoint permet de transitionner un document DIP → SEALED
  4. Un package DIP peut contenir 1 à N documents
  5. Chaque transition DIP génère une attestation de restitution
  6. Chaque transition DIP est journalisée dans l'audit log
  7. Le model checker TLC ne signale plus de violation ASSUME sur NF Z42-013
  8. Les tests contractuels Prolog passent pour les invariants DIP (INV-02, INV-03, INV-05)

8. Learnings injectés

Story Learning Application
PD-250 Modéliser l'état formel manquant + contractualiser transitions Chaque transition DIP a des gardes et postconditions explicites
PD-81 SLA temporels obligatoires pour chaque transition d'état Documenter SLA min/max pour SEALED→DIP et DIP→SEALED
PD-244 Vérifier version NF Z42-013:2020 Référence normative explicitement 2020

9. Références

  • NF Z42-013:2020 — Archivage électronique, sections 7.6, 4.6.4.2, 10.1
  • ISO 14721:2012 (OAIS) — Reference Model for an Open Archival Information System
  • Modèle TLA+ : ProbatioVault-doc/docs/normes/nf-z42-013/formal/NF_Z42_013.tla
  • Modèle Alloy : ProbatioVault-doc/docs/normes/nf-z42-013/formal/NF_Z42_013.als
  • Audit PD-244 : data/specs-index/doc/epics/legal-compliance/PD-244-audit-iso14641-nfz42013/
  • Rapport audit formel : ProbatioVault-doc/docs/normes/AUDIT-SYNTHESIS.md