PD-86 — Dossier de conformité Gate 8 (CLOSURE)¶
Gate¶
- Type : CLOSURE
- Story : PD-86 — Implémenter détection contenu sensible (IA locale)
- Itération : v1
- Date : 2026-02-24
Documents de référence¶
- PD-86-specification.md (S1)
- PD-86-tests.md (S2)
- PD-86-plan.md (S3)
- PD-86-acceptability.md (S4)
- PD-86-acceptability-review.md (P1 — ChatGPT)
- PD-86-confrontation-step8.md (P2 — Claude)
Synthèse des convergences¶
21 convergences confirmées entre les 4 documents source : - Modèle de données et types : 4 convergences (catégories, statuts, entités, unicité) - Invariants et règles métier : 4 convergences (20/20 INV, 19/19 CA, précédence gate, politique prudente) - Échantillonnage et performance : 4 convergences (vidéo 12 frames, PDF 5 pages, timeout 5000ms, budget P95) - Sécurité : 4 convergences (zero-knowledge, zeroization, logging whitelist, pas de fichiers temporaires) - Gestion des mineurs : 3 convergences (suppressWarning ignoré, seuils clampés, stub PD-84) - Corrections et acceptabilité : 2 convergences (11/11 écarts Gate 3 adressés, corrections post-review appliquées)
Écarts identifiés¶
ECT-01 — Cache non chiffré (INV-86-08 non satisfait)¶
- Type : ECT (Écart Technique)
- Criticité : MAJEUR
- Source : DIV-01 (confrontation) + R-01/S-02 (reviews)
- Description : L'invariant INV-86-08 exige un cache local chiffré. L'implémentation utilise AsyncStorage en clair avec TODO(INV-86-08).
- Mitigation : Sandboxing iOS protège AsyncStorage (accès jailbreak uniquement). Seuls les verdicts sont stockés (pas de média).
- Décision : Écart accepté avec réserve — le sandboxing iOS constitue une protection de niveau OS. La migration vers SecureStore est tracée comme dette technique.
ECT-02 — Sonar Quality Gate non exécuté¶
- Type : ECT (Écart Process)
- Criticité : MAJEUR
- Source : DIV-02 (confrontation)
- Description : Sonar Phase 1.5 est défini BLOQUANT par le processus de gouvernance. Le scan n'a pas été exécuté (token Vault absent).
- Mitigation : Les quality gates locaux (lint/format/tsc/tests) sont tous passés. La validation Sonar sera effectuée via pipeline CI/CD après merge.
- Décision : Écart accepté avec réserve — la validation CI/CD est un filet de sécurité suffisant. Le pipeline sera surveillé.
ECT-03 — Review QA LLM partielle¶
- Type : DIV (Divergence Process)
- Criticité : MINEUR
- Source : DIV-03 (confrontation)
- Description : La review QA ChatGPT n'a pas analysé le code de test (OpenCode auto-reject external files). Vérification manuelle : 34/34 TC implémentés.
- Mitigation : Couverture TC vérifiée via tests Jest (187/187 passent, 17 suites). La vérification manuelle compense la review LLM.
ECT-04 — MockClassifier en production¶
- Type : ECT (Stub documenté)
- Criticité : MINEUR
- Source : ZO-01 (confrontation) + ECT-02 (acceptabilité)
- Description : Le classifieur de production est un mock (scores statiques). L'interface ContentClassifier abstraite est prête pour OnnxClassifier.
- Décision : Acceptable — PD-86 livre l'architecture de détection complète. Le modèle ML réel sera intégré dans une story séparée.
ECT-05 — Extraction vidéo native stubée¶
- Type : ECT (Stub documenté)
- Criticité : MINEUR
- Source : ZO-02 (confrontation) + ECT-03 (acceptabilité)
- Description : L'extraction de frames vidéo utilise un découpage uniforme du buffer au lieu d'un module FFmpeg/AVFoundation natif.
- Décision : Acceptable — le flux de détection vidéo est fonctionnel et testé. L'extraction native sera intégrée dans une story séparée.
ECT-06 — Tests performance device non exécutés¶
- Type : AMB (Zone d'ombre)
- Criticité : MINEUR
- Source : ZO-03 (confrontation)
- Description : Le budget P95 ≤ 700ms (iPhone 12) n'a pas été validé sur device réel. Tests Jest uniquement.
- Décision : Acceptable — benchmark device relève du post-merge. Le MockClassifier n'est pas représentatif pour le benchmark.
ECT-07 — rawScores dans blacklist logging (conservatif)¶
- Type : DIV (Divergence conservatrice)
- Criticité : MINEUR
- Source : DIV-04 (confrontation)
- Description : Le plan ajoute rawScores à la blacklist de logging, non explicitement requis par la spec.
- Décision : Acceptable — approche conservatrice (plus sûr que la spec).
Scores¶
| Critère | Score | Justification |
|---|---|---|
| Conformité | 7.5 | 20/20 INV couverts, 19/19 CA testés, mais INV-86-08 non satisfait (cache chiffré) = -1.5. Stubs documentés et tracés |
| Couverture tests | 8.0 | 187/187 tests, ~96% coverage, 34/34 TC implémentés. Review QA LLM partielle (-0.5), tests device non exécutés (-0.5) mais compensés par couverture Jest excellente |
| Sécurité | 7.5 | Architecture zero-knowledge confirmée, zeroization OK, logging whitelist OK, NetworkGuard OK. Cache non chiffré (-1.5), stub isMinor (-0.5), mais corrections S-01/R-03 appliquées (+0.5) |
| Maintenabilité | 8.5 | Architecture modulaire exemplaire (23 composants, 8 modules), types stricts, interfaces abstraites, séparation claire des responsabilités. Stubs documentés et remplaçables. Code lisible et bien structuré |
Moyenne : (7.5 + 8.0 + 7.5 + 8.5) / 4 = 7.875
Verdict attendu¶
- Tous les scores >= 8 ? NON (conformité=7.5, sécurité=7.5)
- Moyenne >= 7 ? OUI (7.875)
- Au moins un score < 6 ? NON
- => RESERVE (moyenne >= 7 mais au moins un score < 8)