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'appelawait this.emitAudit(...)dans le catch global propage desormais toute erreur d'audit comme 500 (fail-closed).- Le commentaire
// INV-85-05: Audit WORM fail-closedconfirme l'intention. - Les
ExportExceptiondeja 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 = 30confirme la borne contractuelle.export.service.ts:308:const ttlSeconds = this.signedUrlTtlMin * 60utilise 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 <= 1800et>= 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.logAsyncest appele avecactorId,actionType,entityTypesur 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.tsreste 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
getSignedUrlest appele et quesignedUrls.length > 0pour un export valide. - TC-NOM-07 (export.integration.spec.ts:253-266) : verifie que
expiresAtest 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) etexport.service.ts:219(proof non possedee) lancent le meme code erreurPROOF_NOT_FOUNDavec le meme message"Proof not found: ${proofId}".- Le commentaire
// E-05: uniform error message to prevent resource enumerationconfirme 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
<= 1800set>= 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:checkOwnershipeffectue 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
4150333mentionne "resolve 6 Sonar issues" et le commit1cc32b5mentionne "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¶
- E-03 (MAJEUR, partiellement resolu) : Ajouter un test E2E HTTP (
supertest) pourPOST /exports/complaint-fileassertant 403 + body structure + audit. - E-06 (MINEUR) : Augmenter coverage Stmts au-dela de 85% (actuellement 82.93%).
- 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 |