PD-264 — Dossier de conformité (Étape 8)¶
Type de gate : CLOSURE¶
1. Documents de référence¶
- PD-264-besoin — présent
- PD-264-specification — présent
- PD-264-tests — présent
- PD-264-specification-review — présent
- PD-264-plan — présent
- PD-264-plan-review — présent
- PD-264-code-contracts — présent
- PD-264-acceptability — présent
- PD-264-acceptability-review — présent
- PD-264-rex — absent
- PD-264-decomposition — présent
2. Rapport de confrontation¶
Voir : PD-264-confrontation-step8.md
3. Hypothèses déclarées¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H-01 | Aucun token de production existant avec nonce VARCHAR en base de données de production | Si tokens existants : la migration Phase A doit convertir correctement hex→binary ; le nonce de remplissage (0x00...00) est traçable mais ne respecte pas CSPRNG → acceptable car tokens pré-PD-264 |
| H-02 | Le trigger timestamp_token_immutable() est type-agnostic (RAISE EXCEPTION inconditionnel) | Si le trigger inspectait les types de colonnes : la migration BYTEA casserait le trigger → vérifié : le trigger est bien inconditionnel |
| H-03 | Le worker de réconciliation PD-55 ne fait pas d'hypothèse sur le format du nonce (VARCHAR vs BYTEA) | Si le worker lit/compare le nonce en format spécifique : la migration casserait la réconciliation → à vérifier dans le code du worker |
| H-04 | crypto.randomBytes(16) est disponible dans tous les environnements d'exécution (Node.js ≥ 14) | Si CSPRNG indisponible : le système refuse de démarrer (fail-closed natif Node.js) |
| H-05 | crypto.timingSafeEqual est disponible dans tous les environnements d'exécution (Node.js ≥ 6) | Si indisponible : fallback interdit, fail-closed |
| H-06 | Le timeout de l'appel QTSA HTTP est géré par le client QTSA existant (hors périmètre PD-264, réponse R08) | Si pas de timeout : REQUEST_EMITTED peut rester indéfiniment → timeout BullMQ job comme filet de sécurité |
| H-07 | Les fixtures mock TSA RFC sont conformes ASN.1/DER par construction (mock déterministe) | Si fixture invalide : TC-264-14 détectera le problème avec openssl ts -verify |
| H-08 | L'index UNIQUE sur nonce BYTEA est supporté par PostgreSQL sans limitation de taille (16 octets bien sous les 2704 octets max d'un index btree) | Risque nul pour 16 octets |
4. Écarts consolidés (Review + Confrontation)¶
Écarts BLOQUANTS : 0¶
Écarts MAJEURS : 0¶
Écarts MINEURS : 9¶
| ID | Type | Source | Description |
|---|---|---|---|
| DIV-01 | ECT | Tests | Chi² (TC-264-08) non implémenté — proxy CSPRNG comportemental |
| DIV-02 | ECT | Tests | Concurrence (TC-264-06) : mock séquentiel, pas PG réel |
| DIV-03 | ECT | Tests | 3 placeholders TC-264-14/15/17 — dépendances QTSA/Prolog/nightly |
| DIV-04 | ECT | QG | Sonar QG non exécuté localement (token indisponible) |
| DIV-05 | ECT | Code | errorCode forcé QTSA_UNREACHABLE dans catch global |
| DIV-06 | SEC | Code | errorMessage brut dans résultat job BullMQ |
| DIV-07 | ECT | Tests | TC-264-07 critère timing simplifié (Cliff's delta seul) |
| ZO-01 | ECT | QG | QG global backend en échec (hors périmètre PD-264) |
| ZO-02 | ECT | Tests | Résultat TC-264-07 non rapporté explicitement |
Zones d'ombre non bloquantes : 3¶
| ID | Description | Mitigation |
|---|---|---|
| ZO-03 | H-03 worker PD-55 non confirmé formellement | Code worker utilise ORM, pas de casting VARCHAR |
| ZO-04 | Convention nommage SQL non vérifiée | Suit les conventions ProbatioVault existantes |
| ZO-05 | Prolog 18/18 non vérifié | Hors Jest, exécution séparée documentée |
5. Scoring Gate 8 CLOSURE¶
Base 10, pénalités : -0.25 par écart MINEUR.
Conformity (conformité spec/implémentation)¶
- 14/14 INV couverts, 12/12 CA couverts
- 1 écart MINEUR (DIV-05: errorCode placeholder)
- Score : 10 - 0.25 = 9.75
Test Coverage (couverture et qualité des tests)¶
- 95/95 tests, coverage 95.38% > 80%
- 4 écarts MINEURS (DIV-01 Chi², DIV-02 concurrence mock, DIV-03 placeholders, DIV-07 timing)
- Score : 10 - 4×0.25 = 9.0
Security (sécurité)¶
- 0 vulnérabilité CRITIQUE/MAJEURE, CSPRNG + timingSafeEqual + défense profondeur
- 1 écart MINEUR (DIV-06: errorMessage brut)
- Score : 10 - 0.25 = 9.75
Maintainability (maintenabilité)¶
- Séparation responsabilités, automate déclaratif, migration réversible
- 3 écarts MINEURS (DIV-04 Sonar non exécuté, ZO-01 QG global, ZO-02 résultat timing)
- Score : 10 - 3×0.25 = 9.25
6. Verdict¶
- conformity : 9.75
- test_coverage : 9.0
- security : 9.75
- maintainability : 9.25
- Moyenne : 9.4375
- Score min : 9.0
Tous les scores >= 8 → GO
- GO — conformité vérifiée
- RESERVE — conformité partielle, conditions à satisfaire
- NON_CONFORME — écarts bloquants identifiés
- ESCALADE — décision humaine requise