Aller au contenu

PD-278 — Agent Developer Report: dip-entity-extension

Module : dip-entity-extension Agent : agent-developer Date : 2026-03-01 Statut : COMPLETE


1. Travail effectue

1.1 Fichier modifie

src/modules/documents/entities/document-secure.entity.ts

1.2 Modifications

A. Extension de l'enum DocumentStatus

Ajout de la valeur DIP a l'enum DocumentStatus (ligne 38) :

/** Dissemination Information Package — communication probatoire (NF Z42-013 §4.6.4.2, PD-278) */
DIP = 'DIP',

L'enum contient desormais 5 valeurs : PENDING, SEALED, EXPIRED, RESTITUTED, DIP.

Le commentaire JSDoc du cycle de vie (lignes 14-26) a ete mis a jour pour inclure la branche DIP dans le diagramme ASCII.

B. Ajout des colonnes DIP

6 nouvelles colonnes ajoutees dans une section dediee // ========== Champs PD-278 (DIP — NF Z42-013 §4.6.4.2) ========== (lignes 240-296), placee entre les champs PD-279 et les champs PD-63 :

Colonne Type TypeORM Type DB Nullable Default Invariant
disseminatedAt timestamptz TIMESTAMPTZ true NULL INV-278-02
disseminatedBy uuid UUID true NULL INV-278-02
disseminationReturnedAt timestamptz TIMESTAMPTZ true NULL INV-278-03, INV-278-13
disseminationPackageId uuid UUID true NULL INV-278-11
motifCommunication varchar(1024) VARCHAR(1024) true NULL INV-278-06 (WORM trigger)
retentionDue boolean BOOLEAN false false INV-278-14

2. Verification des invariants

Invariant Statut Detail
INV-278-01: DocumentStatus enum contient DIP CONFORME DIP = 'DIP' present dans l'enum. Pas de verification de cardinalite exacte (l'enum DB contient aussi RESTITUTED PD-279).
Colonnes disseminated_at, disseminated_by, dissemination_returned_at, dissemination_package_id, motif_communication, retention_due declarees CONFORME Les 6 colonnes sont declarees avec les types et contraintes conformes a la spec §5.1.

3. Verification des interdits (forbidden)

Interdit Statut Detail
Modifier les colonnes existantes de DocumentSecure RESPECTE Aucune colonne existante modifiee. Les champs encryptedMetadata, fileHash, ovhPath, status, sealedAt, retentionUntil, expiredAt, deletedAt, deletionReason, legalLock, legalLockReason, legalLockUntil sont intacts.
Supprimer ou renommer des colonnes PD-279 RESPECTE restitutedAt, restitutionDeadline, geoCopyCount sont intacts (lignes 218-238).

4. Verification TypeScript

$ npx tsc --noEmit --pretty
(aucune erreur)

La compilation TypeScript passe sans erreur ni warning.

5. Mapping colonnes entity vs spec §5.1

Spec §5.1 Entity property DB column name Type match Nullable match
disseminated_at RFC3339 UTC ms disseminatedAt disseminated_at timestamptz nullable: true
disseminated_by UUID actor disseminatedBy disseminated_by uuid nullable: true
dissemination_returned_at RFC3339 UTC ms disseminationReturnedAt dissemination_returned_at timestamptz nullable: true
dissemination_package_id UUID nullable disseminationPackageId dissemination_package_id uuid nullable: true
motif_communication UTF-8 0..1024 motifCommunication motif_communication varchar(1024) nullable: true
retention_due boolean retentionDue retention_due boolean NOT NULL, default false

6. Validation Phase 0 (H-06)

geo_copy_count existe dans l'entity (ligne 218) avec type: 'integer', default: 0. Ce champ est la source de verite pour la garde copies >= MIN_COPIES (INV-278-02). Le commentaire STUB (// STUB: PD-XXX) confirme que le mecanisme de comptage copies geo est a implementer par une story dediee. La garde DIP utilisera ce champ tel quel.

7. Hypotheses documentees

ID Hypothese Impact
H-LOCAL-01 Les colonnes DIP (disseminated_at, disseminated_by, etc.) sont nullable car un document n'est pas forcement passe en DIP. Seul retention_due est NOT NULL avec default false (spec §3 + §5.1). Conforme a la spec §5.7 "Nouvelles colonnes nullable sauf retention_due default false".
H-LOCAL-02 Le name explicite dans chaque @Column() garantit la correspondance exacte avec les noms de colonnes DDL de la migration C1. Si la migration utilise des noms differents, desynchronisation entity/DB.

8. Dependances inter-agents

Agent Dependance Direction
agent-migration (C1) La migration DDL doit creer les colonnes avec les memes noms et types que l'entity Entity → Migration
agent-core (C9) Le service DIP lira et ecrira ces colonnes via l'entity Entity → Service
agent-state-machine (C3) La machine a etats utilisera DocumentStatus.DIP Entity → State Machine
agent-tests (C13) Les tests verifieront DocumentStatus.DIP et les colonnes Entity → Tests

9. Matrice de couverture tests

Test ID Couvert par cette modification Detail
TC-INV-01 Partiellement DIP present dans l'enum TypeScript. Le test DB (enum_range) depend de la migration C1.
TC-NR-01 Oui Colonnes existantes non modifiees (WORM preserve).
TC-NR-05 Partiellement L'enum TypeScript expose DIP. La compatibilite complete depend des consommateurs.

10. Fichiers hors perimetre identifies

Aucun fichier hors perimetre n'a necessite de modification.

11. Decisions architecturales

architectural_decisions:
  - decision: "Colonnes DIP placees dans une section dediee entre PD-279 et PD-63"
    rationale: "Maintient l'organisation chronologique par PD-ticket, facilite la lecture et la non-regression"
    alternatives_considered: ["Colonnes en fin de classe", "Colonnes groupees par type (timestamps, UUIDs, etc.)"]
    trade_offs: ["Organisation par ticket = coherent avec le pattern existant PD-279/PD-63"]