PD-278 — Agent Developer — Module dip-config
Livrable
Fichier produit : src/modules/documents/config/dissemination.config.ts
Résumé
Configuration Joi centralisée pour toutes les bornes numériques du flux DIP (spec §5.5, §5.6). Validation stricte au démarrage avec rejet fail-fast — aucun clamping silencieux.
Invariants respectés
| Invariant | Mécanisme |
| Toutes les bornes numériques sont configurables via env vars avec defaults contractuels | 8 env vars avec defaults : DIP_MIN_COPIES=2, DIP_MAX_PACKAGE_SIZE=100, DIP_MOTIF_MAX_LENGTH=1024, SLA_TARGET_SEALED_TO_DIP_MS=2000, SLA_TARGET_DIP_TO_SEALED_MS=1500, SLA_HARD_TIMEOUT_MS=5000, DIP_RATE_LIMIT_PER_MIN=60, DIP_QUOTA_PER_DAY=1000 |
| Validation Joi avec min/max stricts — rejet startup si hors bornes (pas de clamping) | Joi.number().integer().min(X).max(Y) sur chaque paramètre, throw error si validation échoue |
Forbidden respectés
| Interdit | Preuve de conformité |
| Valeurs magiques en dur dans le code | Toutes les bornes sont dans le schéma Joi avec default(), aucune constante numérique en dur hors du schéma |
| Clamping silencieux de valeurs hors bornes | Joi .min()/.max() rejette strictement ; throw error dans validateDisseminationConfig() |
Interface exportée : DisseminationConfig
export interface DisseminationConfig {
minCopies: number; // [2, 10], default 2
maxPackageSize: number; // [1, 100], default 100
motifMaxLength: number; // [0, 1024], default 1024
slaTargetSealedToDipMs: number; // [200, 5000], default 2000
slaTargetDipToSealedMs: number; // [200, 5000], default 1500
slaHardTimeoutMs: number; // [1000, 30000], default 5000
rateLimitPerMinute: number; // [1, 1000], default 60
quotaPerDay: number; // [1, 100000], default 1000
}
Variables d'environnement
| Variable | Default | Min | Max | Unité | Référence spec |
DIP_MIN_COPIES | 2 | 2 | 10 | copies | §5.6 |
DIP_MAX_PACKAGE_SIZE | 100 | 1 | 100 | éléments | §5.6 |
DIP_MOTIF_MAX_LENGTH | 1024 | 0 | 1024 | caractères UTF-8 | §5.6 |
SLA_TARGET_SEALED_TO_DIP_MS | 2000 | 200 | 5000 | ms | §5.5 |
SLA_TARGET_DIP_TO_SEALED_MS | 1500 | 200 | 5000 | ms | §5.5 |
SLA_HARD_TIMEOUT_MS | 5000 | 1000 | 30000 | ms | §5.5 |
DIP_RATE_LIMIT_PER_MIN | 60 | 1 | 1000 | req/min | §5.6 |
DIP_QUOTA_PER_DAY | 1000 | 1 | 100000 | req/jour | §5.6 |
Décisions architecturales
DA-01 : Pattern destruction.config.ts avec Number.parseInt(value, 10)
- Decision : Réutilisation du pattern
destruction.config.ts (Map + Number.parseInt base 10 + Object.defineProperty) - Rationale : Pattern établi et éprouvé dans le projet (PD-250, PD-279).
Number.parseInt(v, 10) est plus robuste que Number(v) pour les entrées non numériques (ignore les suffixes). - Alternatives considered : Pattern
restitution.config.ts (plus simple, Number() direct), Injectable class pattern (integrity.config.ts) - Trade-offs : Plus verbose que le pattern restitution mais plus robuste pour le parsing, et cohérent avec le fichier voisin
destruction.config.ts qui a plus de paramètres similaires.
DA-02 : allowUnknown: true dans les options Joi
- Decision : Utiliser
allowUnknown: true (comme restitution.config.ts) plutôt que allowUnknown: false (comme destruction.config.ts) - Rationale : La config de dissemination est chargée dans un
process.env contenant toutes les variables de l'application. allowUnknown: false rejetterait les variables d'autres modules (DATABASE_URL, REDIS_HOST, etc.) si passées directement. Le pattern restitution.config.ts utilise allowUnknown: true pour cette raison. - Alternatives considered :
allowUnknown: false avec extraction préalable des clés connues - Trade-offs :
allowUnknown: true ne valide pas la présence de variables inattendues, mais c'est acceptable car seules les clés DIP_* et SLA_* sont extraites.
Exports
| Export | Type | Usage |
DisseminationConfig | Interface | Typage de la configuration dans les consumers (C8, C9) |
disseminationConfigSchema | Joi.ObjectSchema | Testable unitairement |
validateDisseminationConfig() | Function | Testable unitairement (injection env custom) |
default (registerAs) | ConfigFactory | NestJS ConfigModule.forFeature() |
Hypothèses
Aucune hypothèse supplémentaire. Toutes les bornes sont directement tirées de la spec §5.5 et §5.6.
Fichiers hors périmètre identifiés
Aucun fichier hors périmètre n'a nécessité de modification.
Matrice de couverture (tests suggérés)
| Test ID | Fichier de test suggéré | Description |
| TC-CONFIG-01 | dissemination.config.spec.ts | Defaults appliqués quand aucune env var fournie |
| TC-CONFIG-02 | dissemination.config.spec.ts | Valeurs custom dans les bornes acceptées |
| TC-CONFIG-03 | dissemination.config.spec.ts | Valeur sous min → Joi.ValidationError |
| TC-CONFIG-04 | dissemination.config.spec.ts | Valeur au-dessus max → Joi.ValidationError |
| TC-CONFIG-05 | dissemination.config.spec.ts | Valeur non numérique → Joi.ValidationError |
| TC-CONFIG-06 | dissemination.config.spec.ts | Valeur flottante rejetée (integer strict) |
| TC-CONFIG-07 | dissemination.config.spec.ts | abortEarly=false : toutes les erreurs collectées |