Aller au contenu

PD-85 — Revue d'acceptabilite (post-correction)

1. References

  • Specification : PD-85-specification.md
  • Tests contractuels : PD-85-tests.md
  • Acceptabilite existante : PD-85-acceptability.md
  • Commit evalue : 1704b59 (feature/PD-85-export-dossier-plainte)
  • Date de revue : 2026-03-08
  • Reviewer : ChatGPT (gpt-5.3-codex) via revue automatisee

2. Suivi des ecarts (append-only)

[2026-03-08] — Suivi E-01

  • Statut precedent : OUVERT
  • Statut actuel : RESOLU
  • Justification factuelle :
  • Le .catch(...) qui absorbait l'echec d'audit a ete retire dans le commit 1704b59.
  • export.service.ts:180-188 : l'appel await this.emitAudit(...) dans le catch global propage desormais toute erreur d'audit comme 500 (fail-closed).
  • Le commentaire // INV-85-05: Audit WORM fail-closed confirme l'intention.
  • Les ExportException deja auditees sont re-lancees directement (L170-173), sans double audit.
  • Preuve de verification :
  • commit 1704b59 / export.service.ts:169-191
  • TC E-01 (export.integration.spec.ts:289-300) — PASS (122/122)

[2026-03-08] — Suivi E-02

  • Statut precedent : OUVERT
  • Statut actuel : RESOLU
  • Justification factuelle :
  • export.service.ts:63 : this.signedUrlTtlMin = Math.max(1, Math.min(configuredTtl, MAX_SIGNED_URL_TTL_MIN)) clamp le TTL a [1, 30] minutes.
  • export.constants.ts:9 : MAX_SIGNED_URL_TTL_MIN = 30 confirme la borne contractuelle.
  • export.service.ts:308 : const ttlSeconds = this.signedUrlTtlMin * 60 utilise la valeur clampee.
  • Preuve de verification :
  • commit 1704b59 / export.service.ts:58-63
  • TC-INV-8504 (export.integration.spec.ts:303-320) — PASS : verifie expiresIn <= 1800 et >= 60

[2026-03-08] — Suivi E-03

  • Statut precedent : OUVERT
  • Statut actuel : PARTIELLEMENT RESOLU
  • Justification factuelle :
  • Test d'integration ajoute (export.integration.spec.ts:270-286) verifiant que auditLogService.logAsync est appele avec actorId, actionType, entityType sur chaque execution reussie.
  • Cependant, il ne s'agit pas d'un test E2E du controller HTTP (aucun supertest / HTTP request). Le test valide le service directement, pas le guard NestJS 403 + body vide via HTTP.
  • Controller complaint-file.controller.ts reste a 0% coverage.
  • Preuve de verification :
  • commit 1704b59 / export.integration.spec.ts:270-286 — PASS
  • Coverage controller : 0% (Stmts, Branch, Funcs, Lines)

[2026-03-08] — Suivi E-04

  • Statut precedent : OUVERT
  • Statut actuel : RESOLU
  • Justification factuelle :
  • TC-NOM-06 (export.integration.spec.ts:241-251) : verifie que getSignedUrl est appele et que signedUrls.length > 0 pour un export valide.
  • TC-NOM-07 (export.integration.spec.ts:253-266) : verifie que expiresAt est defini et constitue une date valide sur les signed URLs retournees.
  • Les tests utilisent un S3 mock (mockS3PresignService) conforme au contrat.
  • Preuve de verification :
  • commit 1704b59 / export.integration.spec.ts:240-267 — PASS (2 tests)

[2026-03-08] — Suivi E-05

  • Statut precedent : OUVERT
  • Statut actuel : RESOLU
  • Justification factuelle :
  • export.service.ts:204 (proof inexistante) et export.service.ts:219 (proof non possedee) lancent le meme code erreur PROOF_NOT_FOUND avec le meme message "Proof not found: ${proofId}".
  • Le commentaire // E-05: uniform error message to prevent resource enumeration confirme l'intention.
  • Un attaquant ne peut plus distinguer "inexistant" de "non possede".
  • Preuve de verification :
  • commit 1704b59 / export.service.ts:203-222
  • TC-ERR-03 (export.integration.spec.ts:188-197) — PASS : proof non possedee retourne PROOF_NOT_FOUND

[2026-03-08] — Suivi E-06

  • Statut precedent : OUVERT
  • Statut actuel : PARTIELLEMENT RESOLU
  • Justification factuelle :
  • Coverage module export mesure le 2026-03-08 : Stmts 82.93%, Branch 74.15%, Funcs 68.65%, Lines 84.57%.
  • Progres par rapport a la mesure initiale (Stmts 82.72%, Branch 74.15%, Funcs 67.64%, Lines 84.33%).
  • Le seuil de 85% Stmts n'est pas atteint (delta +0.21pp). Branch et Funcs restent sous seuil.
  • Preuve de verification :
  • Execution npx jest --testPathPattern="export" — 122 PASS, coverage summary ci-dessus

[2026-03-08] — Suivi E-07

  • Statut precedent : OUVERT
  • Statut actuel : NON RESOLU
  • Justification factuelle :
  • complaint-file.controller.ts : Stmts 0%, Branch 0%, Funcs 0%, Lines 0%.
  • Aucun test E2E / HTTP controller ajoute dans le commit 1704b59.
  • Preuve de verification :
  • Coverage report : complaint-file.controller.ts | 0 | 0 | 0 | 0

[2026-03-08] — Suivi E-08

  • Statut precedent : OUVERT
  • Statut actuel : RESOLU
  • Justification factuelle :
  • TC-INV-8504 ajoute (export.integration.spec.ts:303-320) : verifie que le TTL passe a S3 est <= 1800s et >= 60s (soit [1, 30] min).
  • Preuve de verification :
  • commit 1704b59 / export.integration.spec.ts:303-320 — PASS

[2026-03-08] — Suivi E-09

  • Statut precedent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • secret-exposure.validator.ts : toujours base sur substring match (11 patterns case-insensitive).
  • Aucune modification dans le commit 1704b59. Le risque d'encodage/obfuscation reste identique.
  • Classification maintenue MINEUR car S3 presign constitue la barriere primaire.
  • Preuve de verification :
  • Fichier inchange entre 1cc32b5 et 1704b59

[2026-03-08] — Suivi E-10

  • Statut precedent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • export.service.ts:198-223 : checkOwnership effectue toujours 2 requetes DB par proofId (findOne + query mandate).
  • Pour 500 preuves = 1000 requetes. Aucune optimisation IN-clause.
  • Classification maintenue MINEUR car borne a 500 proofIds max (garde-fou V1).
  • Preuve de verification :
  • Code inchange entre 1cc32b5 et 1704b59

[2026-03-08] — Suivi E-11

  • Statut precedent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • SonarQube non execute dans cette session de revue (serveur sonarqube.dev.probatiovault.com non teste).
  • Le commit 4150333 mentionne "resolve 6 Sonar issues" et le commit 1cc32b5 mentionne "Sonar coverage >= 80%", suggerant une execution prealable.
  • Pas de preuve directe d'execution SonarQube post-commit 1704b59.
  • Preuve de verification :
  • Aucune preuve directe disponible

3. Verdict d'acceptabilite (courant)

Verdict actuel : ⚠️ ACCEPTE AVEC RESERVES

Date : 2026-03-08

Motif synthetique : Les 5 ecarts prioritaires (E-01 BLOQUANT, E-02/E-04/E-05 MAJEURS) sont RESOLUS. E-03 (guard E2E) est partiellement resolu (test service mais pas HTTP). Les ecarts mineurs restants (E-06 coverage, E-07 controller 0%, E-09 secret validator, E-10 N+1, E-11 Sonar) ne constituent pas de blocage pour Gate 8. 122/122 tests PASS.

Conditions de levee des reserves restantes

  1. E-03 (MAJEUR, partiellement resolu) : Ajouter un test E2E HTTP (supertest) pour POST /exports/complaint-file assertant 403 + body structure + audit.
  2. E-06 (MINEUR) : Augmenter coverage Stmts au-dela de 85% (actuellement 82.93%).
  3. E-07 (MINEUR) : Couvrir le controller HTTP (actuellement 0%).

4. Historique des verdicts

Date Verdict Version / commit Commentaire
2026-03-08 ⚠️ ACCEPTE AVEC RESERVES 1cc32b5 Initial : 1 BLOQUANT (E-01), 4 MAJEURS, 6 MINEURS
2026-03-08 ⚠️ ACCEPTE AVEC RESERVES 1704b59 E-01/E-02/E-04/E-05/E-08 RESOLUS, E-03 partiel. Reserves residuelles : E-03/E-06/E-07