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¶
- DIV-02 : Renforcer TC-250-20 pour vérifier 403 + audit
DOCUMENT_DESTROY_ACCESS_DENIED(avant merge) - 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)
- MINEURS (DIV-01, DIV-03 à DIV-07, DIV-09, DIV-10) : acceptés en réserves post-merge