Aller au contenu

PD-251 — Acceptabilité

Story : PD-251 — Job vérification intégrité périodique Date : 2026-02-25 Branche : feature/PD-251-verification-integrite-periodique

Prérequis acceptabilité

  • Tests CI : 231/231 passing (local Jest, 2.3s)
  • Coverage : module integrity isolé, tests unitaires complets
  • TODO non tracés : aucun
  • Code DEV ONLY : aucun (migration skeleton documenté comme stub)

Phase 1 — Reviews automatisées

Résultats quality gates (v2 — post-corrections)

Check Résultat Détails
ESLint OK 0 erreurs, 0 warnings (--quiet)
Prettier OK Tous fichiers formatés
TypeScript (tsc) OK 0 erreurs de compilation
Tests Jest OK 231/231 tests passing

Analyse Sonar

  • Quality Gate : N/A (sonar-scanner non disponible en local — pipeline GitLab vérifiera)
  • Substitution : ESLint strict (0 error, 0 warning --quiet) + tsc --noEmit OK

Phase 2 — Reviews LLM (ChatGPT — validation croisée)

Itération v1 (pre-corrections)

Review Verdict Écarts
Code (développeur senior) NON_CONFORME 4 Critique, 6 Majeur, 4 Mineur
Tests (QA engineer) RÉSERVES 1 Critique, 6 Majeur, 5 Mineur
Sécurité (pentester adversarial) NON_CONFORME 2 Critique, 5 Élevé, 3 Moyen

Corrections v1 appliquées (commit 143a2a6)

Fix Description Fichiers
REV-01/SEC-01 BullMQ queue names :. (Redis key collision) constants.ts
REV-02/SEC-03 Guard fail-closed (ServiceUnavailableException) archive-access.guard.ts
REV-03/SEC-02 timingSafeEqual pour comparaisons de hashes chain-verifier, double-verification, restoration
REV-06 Lua compare-and-delete pour locks Redis periodic-run, reconciliation processors
REV-07/SEC-09 OnModuleDestroy + redis.quit() periodic-run, reconciliation processors
REV-13 Re-throw errors dans archive-verify (BullMQ retry) archive-verify.processor.ts
SEC-07 HSM failure → CRITICAL log + entry UNSIGNED integrity-journal.service.ts
SEC-03 SQL paramétré dans orchestrator (injection via config) integrity-run-orchestrator.service.ts
SEC-04 Bornes individuelles poids priorité [0,1] integrity.config.ts
SEC-05 @UseGuards(JwtAuthGuard) + jobId idempotent integrity.controller.ts

Itération v2 (post-corrections v1)

Review Verdict Écarts restants
Code (développeur senior) NON_CONFORME 7 Majeur, 3 Mineur
Tests (QA engineer) RÉSERVES 7 Majeur, 2 Mineur
Sécurité (pentester adversarial) NON_CONFORME 5 Majeur, 2 Réserve/Mineur

Corrections v2 appliquées (commit cefbbc1)

Fix Description Fichiers
S-01 Ownership check sur endpoints archives (IDOR fix) integrity.controller.ts
S-02 @Roles('integrity:admin') sur POST /runs integrity.controller.ts
S-05 Journal append-only AVANT transition d'état archive-state-machine.service.ts
S-07 Bornes timeoutSeconds dans validateRunParams integrity-config-validator.service.ts
AuthorizationGuard ajouté au controller integrity.controller.ts
3 tests IDOR ajoutés (owner, investigator, non-owner) integrity.controller.spec.ts

Écarts résiduels documentés (hors périmètre PD-251)

ID Description Justification
R-03/S-04 Migration DDL vide (triggers append-only) Migration skeleton — DDL réelle en PD-252 (infra DB). Le code applicatif interdit UPDATE/DELETE.
R-04 Signature PDF non cryptographique PDF signing = scope PD-37 (HSM audit signature). Stub documenté.
R-05 Versionnement probatoire complet (blockchain) Chaîne probatoire complète = scope PD-55 (blockchain anchoring) + PD-63 (download). Stub avec TODO tracé.
R-06 Complétude partielle run (timeout polling) Acceptable MVP — le run est marqué PARTIAL si incomplet. Amélioration future.
R-09 Métriques in-memory (reset restart) Acceptable MVP — Prometheus scrape externe planifié en PD-260.
T-02/T-03/T-04 Tests e2e intégration DB/SLA Tests d'intégration PostgreSQL = périmètre pipeline CI, pas tests unitaires.
T-05 Test atomicité crash pre/post-commit Nécessite infrastructure test PostgreSQL réelle (pipeline CI).
S-03/R-07 ThrottlerGuard absent ThrottlerModule non importé dans le projet. Rate limiting sera ajouté en PD-265 (cross-cutting). Le lock Redis empêche déjà la concurrence d'exécution.
S-06 Exposition données preuve (DTO incidents) Filtrage par rôle sur DTO = amélioration future. L'ownership check (S-01 fix) limite déjà l'accès.

Synthèse

Bilan corrections

Métrique v1 → v2
Corrections appliquées 10 (v1) + 6 (v2) = 16 total
Tests ajoutés 4 (v2 : 3 IDOR + 1 bounds)
Tests total 231 passing
Fichiers modifiés 18 fichiers de code

Couverture contractuelle

Invariant Couvert Commentaire
INV-251-01 Run périodique + rotation scope
INV-251-02 Vérification 4 maillons chaîne
INV-251-03 Double vérification + timing-safe
INV-251-04 Config contractuelle avec bornes
INV-251-05 Journal append-only signé HSM (pré-transition)
INV-251-06 ⚠️ Guard implémenté, branchement endpoints documents = hors scope
INV-251-07 Précondition snapshot signé
INV-251-08 Restauration CRR + retries
INV-251-09 Refus suppression archives corrompues
INV-251-10 États terminaux fermés
INV-251-11 Priorisation pondérée
INV-251-12 ⚠️ Rapport JSON signé, PDF stub (scope PD-37)
INV-251-13 SLA détection + alerte breach
INV-251-14 Rapport même sans anomalie
INV-251-15 Réconciliation Merkle
INV-251-16 Alertes ops (notifier)
INV-251-17 ⚠️ Lien version créé, ancrage blockchain = scope PD-55

Verdict

CONFORME AVEC RÉSERVES

  • 17/17 invariants couverts (14 complets, 3 partiels avec stubs documentés)
  • 231/231 tests passing
  • 0 erreur lint/types
  • Écarts résiduels = dépendances inter-PD documentées (PD-37, PD-55, PD-63, PD-252, PD-265)
  • Corrections de sécurité critiques appliquées (IDOR, timing-safe, fail-closed, journal préalable)