PD-254 — Plan Review (Gate 5)¶
Résumé¶
Le plan est globalement solide et bien structuré. Les 11 invariants sont tous mappés à des mécanismes explicites. Les résolutions des constats Gate 3 (R-01 à R-08) sont documentées avec hypothèses techniques traçables. Cependant, 11 écarts sont identifiés, dont 0 bloquant, 5 majeurs et 6 mineurs.
Écarts identifiés¶
Type : Contrainte technique non documentée
Référence : Plan §11 — Périmètre de test / Axe 7
Description : Le plan liste des niveaux de test (unitaire, intégration, E2E) mais ne spécifie jamais le framework de test retenu (Jest ou Vitest). Les tests d'intégration (C3+HSM, C4+fixture, C6+Redis) nécessitent un choix explicite de runner, surtout si des dépendances ESM-only sont utilisées (ex: canonicalize npm).
Impact : Ambiguïté sur la configuration du runner de test, risque de blocage CI si le runner n'est pas compatible avec les dépendances choisies.
Gravité : MAJEUR
Type : Contrainte technique non documentée
Référence : Plan §9 point 4 / Axe 7
Description : Les dépendances inter-PD sont mentionnées (PD-44, PD-54, PD-55, PD-36/37) mais sans leur statut (DONE / TODO / STUB acceptable). Le plan ne précise pas si ces modules exposent déjà les interfaces consommées par C4 VerificationEngine et C8 WormGuard, ou si des stubs sont nécessaires.
Impact : Impossibilité de déterminer si l'implémentation peut démarrer immédiatement ou si des stubs inter-PD bloquent.
Gravité : MAJEUR
Type : Contrainte technique non documentée
Référence : Plan §1 C3 — bibliothèque canonicalize (npm) / Axe 7
Description : La compatibilité ESM/CJS n'est pas documentée. La bibliothèque `canonicalize` (npm) est ESM-only depuis sa v2. Le plan ne précise pas la version retenue ni si le runner de test et le build NestJS sont configurés pour supporter l'import ESM.
Impact : Erreur `ERR_REQUIRE_ESM` possible en runtime ou en test si le projet est configuré en CJS (configuration par défaut de NestJS).
Gravité : MAJEUR
Type : Hypothèse implicite
Référence : INV-254-09 (reproductibilité) / C4 VerificationEngine — ReadabilityCheck
Description : Le plan interdit `Math.random()` et mentionne un "seed déterministe" dans les forbidden patterns, mais ne spécifie pas comment le seed de sampling est déterminé, passé, ni persisté entre precheck et postcheck. Pour satisfaire INV-254-09 (résultat déterministe à paramètres identiques), l'échantillon de lisibilité doit être reproduit à l'identique lors d'un replay.
Impact : Sans mécanisme explicite de seed, deux exécutions avec les mêmes paramètres pourraient sélectionner des échantillons différents, violant INV-254-09.
Gravité : MAJEUR
Type : Risque sécu/conformité
Référence : C6 DistributedProtectionService — Lock distribué / §5.10
Description : Le plan spécifie Redis SET NX avec TTL pour le lock distribué, mais ne mentionne pas de fencing token ni de mécanisme de protection contre le scénario classique : client A acquiert le lock, est retardé au-delà du TTL, le lock expire, client B acquiert le lock, client A reprend et croit toujours détenir le lock. Les deux clients exécutent alors en parallèle.
Impact : Exécution concurrente possible malgré le lock, violant potentiellement INV-254-09 (reproductibilité) et créant un risque de double-attestation.
Gravité : MAJEUR
Type : Hypothèse implicite
Référence : Plan §1 C2, C3 — MigrationCampaignEntity, ManifestRegistryEntity
Description : Le plan crée 2 nouvelles entités TypeORM (MigrationCampaign, ManifestRegistry) qui nécessitent des migrations DDL (CREATE TABLE). Or le plan §10 ne mentionne aucune migration TypeORM à générer, et la spec §5.12 dit "Aucune stratégie de migration DDL applicable". La création de nouvelles tables est distincte de la migration de schéma existant exclue par la spec — mais le plan ne clarifie pas ce point.
Impact : Absence de migration TypeORM dans le plan de tâches, risque d'oubli à l'implémentation.
Gravité : MINEUR
Type : Hypothèse implicite
Référence : Plan §6 — Traitement erreurs techniques / C6 DistributedProtectionService
Description : La disponibilité de Redis n'est pas listée comme précondition dans le flux F1 (§2, step 6 vérifie accès source/cible/registre/HSM/runbook — pas Redis). Or C6 dépend entièrement de Redis pour lock, idempotence et rate-limiting. Si Redis est indisponible au lancement, le comportement n'est pas spécifié (fail-open ou fail-closed ?).
Impact : Sans précondition Redis explicite, une indisponibilité Redis pourrait soit bloquer silencieusement le flux, soit le laisser passer sans protection distribuée.
Gravité : MINEUR
Type : Cohérence Plan ↔ Tests
Référence : Plan §5 — TC-PRECHECK-EXP-01
Description : Le plan ajoute un test TC-PRECHECK-EXP-01 (résolution de R-04) qui n'existe pas dans le document PD-254-tests.md. Le plan résout un constat Gate 3 en créant un nouveau test, mais celui-ci n'a pas de scénario Given/When/Then dans le document de tests contractuels.
Impact : Le test existe dans le mapping du plan mais pas dans le référentiel de tests — asymétrie documentaire qui complique l'audit.
Gravité : MINEUR
Type : Non-conformité Spec
Référence : Plan §6 — Codes HTTP (400, 422, 409, 503, 410) / Spec §6
Description : Le plan attribue des codes HTTP spécifiques à chaque code métier (INVALID_INPUT→400, INVALID_MANIFEST→422, etc.). La spec ne définit aucun code HTTP — elle définit des codes métier et des comportements. Le plan introduit un contrat d'interface HTTP non spécifié.
Impact : Faible — les codes sont raisonnables, mais ils constituent un ajout non contractualisé qui pourrait diverger d'une implémentation strictement conforme à la spec.
Gravité : MINEUR
Type : Non-conformité Spec
Référence : Plan §6 — "retry 3× avec backoff exponentiel" / Spec §6 ERR-07
Description : Le plan ajoute une politique de retry (3× backoff exponentiel) pour les erreurs I/O stockage. La spec (ERR-07, §5.10 réconciliation) ne définit pas de retry intra-phase — elle prévoit uniquement la réconciliation cron pour les jobs orphelins. Le retry ajouté pourrait masquer des défaillances transitoires avant l'entrée en réconciliation.
Impact : Comportement ajouté non spécifié qui modifie le chemin d'erreur (retry silencieux avant réconciliation).
Gravité : MINEUR
Type : Contrainte technique non documentée
Référence : Plan §7 C7 — CI Pipeline / Axe 7
Description : Les variables CI nécessaires aux tests d'intégration ne sont pas documentées. Les composants C2/C3 nécessitent une connexion PostgreSQL (DATABASE_URL), C6 nécessite Redis (REDIS_URL), et les tests HSM nécessitent les credentials CloudHSM. Aucune de ces variables n'est listée dans le plan.
Impact : Configuration CI incomplète, risque de jobs en échec par absence de variables d'environnement.
Gravité : MINEUR
Synthèse¶
| Gravité | Nombre |
|---|---|
| BLOQUANT | 0 |
| MAJEUR | 5 |
| MINEUR | 6 |
| Total | 11 |
Les 5 majeurs portent sur : (1-3) l'absence de section "Contraintes techniques" formelle (framework de test, ESM/CJS, statut dépendances inter-PD), (4) le mécanisme de seed de sampling non spécifié pour la reproductibilité, et (5) la sécurité du lock distribué sans fencing token. Aucun invariant n'est non couvert, et aucun test n'est irréalisable avec les mécanismes proposés.