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 :
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'enumDocumentStatusdansdocument-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¶
- L'enum
DocumentStatuscontient 4 valeurs :PENDING,SEALED,DIP,EXPIRED - Un endpoint permet de transitionner un document
SEALED → DIP - Un endpoint permet de transitionner un document
DIP → SEALED - Un package DIP peut contenir 1 à N documents
- Chaque transition DIP génère une attestation de restitution
- Chaque transition DIP est journalisée dans l'audit log
- Le model checker TLC ne signale plus de violation ASSUME sur NF Z42-013
- 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