PD-262 — Plan d’implémentation : Revue¶
1. Références¶
- Spécification : PD-262-specification.md
- Tests contractuels : PD-262-tests.md
- Plan d’implémentation : PD-262-plan.md
- Date de revue : 2026-03-06
- Reviewer : Auditeur technique indépendant (IA)
2. Constatations (écarts)¶
| Type | Référence (Spec/Test/Plan) | Description | Impact | Gravité (BLOQUANT/MAJEUR/MINEUR) |
|---|---|---|---|---|
| Non-conformité Spec | INV-262-02 / Spec §4 / Plan §1 (C3, C4), §2 (FT3) | Le plan décrit une orchestration lockout/purge pilotée côté service TypeScript (handleDetection -> tamperingPurgeService), alors que l’invariant impose une décision lockout/purge uniquement native non inhibable/non retardable par JS. | Dépendance fonctionnelle à la couche JS sur une décision critique de sécurité ; risque de contournement/retard via bridge/runtime. | BLOQUANT |
| Non-conformité Spec | ERR-10, CA-18, INV-262-09, INV-262-12 / Spec §5 F6 + §6 / Plan §2 (FT6) | FT6 prévoit lockout absent + first_launch_clean présent => MONITORED, sans condition explicite de reconstruction fail-closed du cas crash/kill entre TAMPERED_SESSION et LOCKED_PERSISTENT. | Possibilité de reprise nominale après interruption en fenêtre critique, contraire à l’irréversibilité attendue. | BLOQUANT |
| Test irréalisable | CA-16, TC-NOM-08 / Tests §3, §8 / Plan §5 (mapping TC-NOM-08), §11 | Le plan associe la vérification de persistance lockout majoritairement à une “Integration (mock Keychain)”, alors que le test contractuel exige inspection des métadonnées Keychain réelles (kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly). | Le test contractuel ne peut pas être démontré avec le mécanisme de test décrit ; validation de conformité incomplète. | BLOQUANT |
| Hypothèse implicite | INV-262-10, CA-14 / Plan §4 (CA-14), §8 (HT-05, HT-06) | La conformité “aucun secret temporaire en clair au repos” est déléguée à des modules existants et hypothèses d’architecture, sans mécanisme contractuel explicite couvrant exhaustivement tous artefacts temporaires mentionnés. | Risque de trou de couverture sur l’invariant crypto si un artefact temporaire échappe au périmètre réel des modules délégués. | MAJEUR |
| Test irréalisable | TC-NOM-06, TC-ERR-06 / Tests §3-4 / Plan §5 (niveau “Unit (conditions compilées)”) | Les scénarios de gating compile-time (DEBUG/SIMULATOR/QA flag build) sont mappés en tests unitaires, sans observabilité de build matrix native explicitée dans le mécanisme de test. | Démonstration contractuelle partielle des règles compile-time ; risque de non-preuve du comportement en configuration réelle. | MAJEUR |
| Contrainte technique non documentée | Plan global (absence section “Contraintes techniques” dédiée) | Le plan ne documente pas explicitement le framework de test choisi (Jest ou Vitest). | Ambiguïté d’exécution QA et reproductibilité CI. | MINEUR |
| Contrainte technique non documentée | Plan global | Compatibilité ESM/CJS (dépendances ESM-only et adaptation runner) non documentée. | Risque d’échec d’exécution des tests/runner lié au mode module ; contrainte demandée non satisfaite. | MAJEUR |
| Contrainte technique non documentée | Plan global | Variables CI requises (ex: DATABASE_URL, CI=true, etc.) non documentées pour les tests d’intégration/perf. | Exécution pipeline non déterministe selon environnement. | MINEUR |
| Contrainte technique non documentée | Plan §9.3, §12 | Dépendances inter-PD non listées avec statut explicite unifié (DONE/TODO/STUB) pour l’ensemble des dépendances citées (PD-98, PD-107, PD-283, etc.). | Traçabilité contractuelle inter-stories incomplète. | MINEUR |
| Code Contract — Forbidden | Code contracts T10 / section forbidden | Règle “Tester sign et verify isolement (roundtrip obligatoire si crypto)” non reliée au périmètre de la story PD-262 ni aux invariants contractuels fournis. | Pollution normative du contrat de code ; risque d’ambiguïté d’audit sur exigences hors périmètre. | MINEUR |
3. Synthèse¶
- Nombre d’écarts par gravité : BLOQUANT: 3 / MAJEUR: 3 / MINEUR: 4
- Points critiques :
- Contradiction sur l’autorité native (lockout/purge) vs orchestration JS.
- Reconstruction d’état au boot incompatible avec le cas crash/kill contractuel.
- Mécanismes de test décrits insuffisants pour prouver certains TC contractuels (notamment Keychain metadata et gating compile-time).
Vérification du contexte itération v2 : - E-01 : corrigé (présence de getDeviceIdPseudo dans plan + contracts). - E-02 : partiellement corrigé (distinction reconstruction/transition ajoutée, mais incohérence persistante sur cas crash/kill). - E-03 : corrigé (stub PD-283 explicité). - E-04 : corrigé (tests adversariaux device réel explicités). - E-05 : corrigé (bootstrapping first_launch_clean documenté).
4. Verdict de la revue¶
- Statut : ⛔ Rejeté
- Motif synthétique : le plan reste non conforme sur des invariants critiques (autorité native, reconstruction fail-closed post-crash) et ne permet pas de démontrer intégralement certains tests contractuels obligatoires.