Aller au contenu

PD-250 — Dossier de conformité (Étape 8 — Gate CLOSURE v1)

Type de gate : CLOSURE

1. Documents de référence

  • PD-250-specification.md — v4
  • PD-250-tests.md — v4
  • PD-250-plan.md — v1
  • PD-250-code-contracts.yaml — v1
  • PD-250-acceptability.md — v1
  • PD-250-acceptability-review.md — v1 (Phase 1 review ChatGPT)
  • PD-250-confrontation-step8.md — v1 (Phase 2 confrontation Claude)
  • PD-250-decomposition.md — v1

2. Rapport de confrontation

Voir : PD-250-confrontation-step8.md

Convergences : 13 points confirmés (couverture 16/16 INV, 16/16 CA, 8/8 ERR, 475/475 tests, coverage 92.79%, stack contractuelle respectée, fail-closed, audit transactionnel, réserves Gate 5 résolues).

Divergences : 10 identifiées (2 MAJEURES, 8 MINEURES).

Zones d'ombre : 5 documentées (ambiguïtés contractuelles sans impact fonctionnel).

3. Hypothèses déclarées

ID Hypothèse Statut
HYP-IMPL-01 Entity DocumentSecure extensible avec nouveaux statuts VALIDÉE — migration + entity alignées
HYP-IMPL-02 Module tsa/ expose service injectable VALIDÉE — TSA adapter créé (stub TODO(PD-250))
HYP-IMPL-03 Module audit/ expose AuditLogService.log() injectable VALIDÉE — DestructionAuditService intégrée
HYP-IMPL-04 @aws-sdk/client-s3 supporte DeleteObjectCommand VALIDÉE — S3 adapter créé (stub TODO(PD-250))
HYP-IMPL-05 pdf-lib compatible CJS VALIDÉE — imports fonctionnels dans les tests
HYP-IMPL-06 EventEmitter2 supporte @OnEvent pour préavis VALIDÉE — pattern implémenté
HYP-IMPL-07 Séquence PostgreSQL audit_seq dans vault_secure VALIDÉE — migration créée
HYP-IMPL-08 Guard AuthorizationGuard + @Roles('admin') réutilisable VALIDÉE — câblé sur BordereauController
HYP-IMPL-09 Queues BullMQ avec - (pas :) VALIDÉE — pv-jobs-destruction, pv-jobs-prenotice
HYP-IMPL-10 LegalDestructionService injectable pour zeroization VALIDÉE — pattern réutilisé

4. Écarts identifiés

4.1 Écarts MAJEURS

ID Type Source Description Impact
DIV-02 ECT P1 (E-02, E-05), P2 (DIV-02) Test 403 + audit refusé : preuve contractuelle incomplète. TC-250-20 ne vérifie ni le code HTTP 403 ni l'appel logBatchEvent(DOCUMENT_DESTROY_ACCESS_DENIED). Le mécanisme existe dans le code (DestructionAccessDeniedFilter) mais INV-250-15 n'est pas prouvé par les tests. INV-250-15 non prouvé contractuellement
DIV-08 ECT P2 (DIV-08) Quality Gate Sonar non exécutée (Phase 1.5). Docker indisponible localement, sonar-scanner non installé. Reviews LLM lancées sans validation Sonar préalable. Violation du processus de gouvernance (CLAUDE.md : Phase 1.5 BLOQUANTE)

4.2 Écarts MINEURS

ID Type Source Description
DIV-01 SEC P1 (S-02), P2 (DIV-01) Filtre entity_type != 'BORDEREAU' absent. Protection implicite par retentionExpiry = null.
DIV-03 DIV P1 (S-03, E-12), P2 (DIV-03) trackedDefault(...) non implémenté. Defaults numériques directs. Observabilité réduite.
DIV-04 ECT P1 (T-03, E-07), P2 (DIV-04) Matrice combinatoire 9 cas WORM non implémentée (couverture partielle).
DIV-05 ECT P1 (T-02, E-06), P2 (DIV-05) Test e2e sécurité endpoint admin absent. Tests unitaires avec mocks uniquement.
DIV-06 DIV P1 (R-04, E-04), P2 (DIV-06) Section architectural_decisions absente du code contracts.
DIV-07 ECT P1 (D), P2 (DIV-07) 4 tests globaux en échec hors périmètre PD-250 (pré-existant sur main).
DIV-09 ECT P1 (T-04, E-08), P2 (DIV-09) Assertions faibles dans certains tests (profondeur insuffisante).
DIV-10 ECT P1 (T-05, E-09), P2 (DIV-10) Test BullMQ v5 trop permissif (scan inclut tests/commentaires).

4.3 Zones d'ombre (sans impact fonctionnel)

ID Description
ZO-01 clockSkewTolerance dans selectPreNotice — ambiguïté spec §5.8
ZO-02 Mécanisme de déclenchement reprise parentBatchId — automatique vs manuel
ZO-03 Frontière stubs/production TSA et S3 — pas de contrôle automatisé eIDAS
ZO-04 Paramètre DESTRUCTION_PRE_NOTICE_JOB_INTERVAL non dans spec §10.2
ZO-05 SLA destructionExecutionSla pour le dernier document — ambiguïté

5. Scoring

Critères Gate CLOSURE

Critère Score Justification
conformity 7.5 16/16 INV couverts. DIV-02 : INV-250-15 non prouvé par tests (-1). DIV-08 : Sonar non exécuté (-1). DIV-01 defense-in-depth manquante (-0.25). DIV-03 trackedDefault absent (-0.25).
test_coverage 7.5 475/475 tests, 92.79% coverage. DIV-02 : assertion triviale TC-250-20 (-1). DIV-04 : matrice 9 cas absente (-0.25). DIV-05 : e2e absent (-0.25). DIV-09 : assertions faibles (-0.25). DIV-10 : scan permissif (-0.25). Base 10 - 2 = 8, -0.25×4 MINEURS excédentaires = 7.5 recalculé : -1 (DIV-02 MAJEUR) -0.25×5 (MINEURS test) = 10 - 1 - 1.25 = 7.75 → 7.5 arrondi conservateur
security 8.5 Auth OidcJwtAuthGuard + AuthorizationGuard + @Roles('admin'). Injection SQL : requêtes paramétrées. PII exclues. BullMQ v5 conforme. Fail-closed systématique. Stubs TSA/S3 documentés (-0.25 chacun). DIV-01 entity_type filter absent (-0.25). Corrections R-01/R-03 appliquées. Base 10 - 0.75 = 9.25, -0.5 stubs = 8.75 → 8.5 arrondi conservateur
maintainability 8.0 Architecture modulaire claire. Code contracts documentés. ESLint/Prettier/TypeScript clean. DIV-06 architectural_decisions absente (-0.25). DIV-03 trackedDefault absent (-0.25). 4 tests globaux pré-existants échec (-0.25). Coverage 92.79% excellent. Base 10 - 0.75 = 9.25 → ajustement DIV-08 processus (-1) = 8.25 → 8.0 arrondi conservateur

Moyenne : (7.5 + 7.5 + 8.5 + 8.0) / 4 = 7.875

6. Verdict attendu

  • GO — conformité vérifiée
  • RESERVE — conformité partielle, conditions à satisfaire
  • NON_CONFORME — écarts bloquants identifiés
  • ESCALADE — décision humaine requise

Justification : Moyenne 7.875 >= 7, mais conformity (7.5) et test_coverage (7.5) < 8 → RESERVE selon règles de scoring.

Conditions de réserve

  1. DIV-02 : Renforcer TC-250-20 pour vérifier 403 + audit DOCUMENT_DESTROY_ACCESS_DENIED (avant merge)
  2. DIV-08 : Sonar Quality Gate à vérifier post-merge via pipeline CI/CD GitLab (dérogation formalisée : ESLint strict + TypeScript strict + 0 erreur comme couverture de substitution)
  3. MINEURS (DIV-01, DIV-03 à DIV-07, DIV-09, DIV-10) : acceptés en réserves post-merge