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¶
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"]