Aller au contenu

PD-254 — Dossier de conformité Gate 8 (CLOSURE) — v1

Date : 2026-03-13 Story : PD-254 — Protocole migration probatoire Gate : 8 — CLOSURE Itération : v1 Reviewers : Claude -p (P1 review + P2 confrontation — dérogation Art. II, prompts >30KB)


1. Documents analysés

Document Auteur Version Taille
PD-254-specification.md ChatGPT (corrigé Claude v2) v2 32KB
PD-254-tests.md ChatGPT (corrigé Claude v2) v2 26KB
PD-254-acceptability.md Claude (orchestrateur) v1 12KB
PD-254-review-step8-v1.md Claude -p (P1) v1 7.7KB
PD-254-confrontation-step8-v1.md Claude -p (P2) v1 9.8KB

2. Dérogation Art. II

Les deux phases (review + confrontation) ont été exécutées par claude -p au lieu de ChatGPT/OpenCode. Raison : prompts assemblés de 60-65KB, au-dessus du seuil ~30KB d'OpenCode (bascule en mode agentic). Dérogation documentée et non structurelle.

3. Écarts identifiés (post-correction)

BLOQUANTS résolus (2)

ID Type Constat Source Statut
E-01 Non-conformité code 3 erreurs TypeScript (npx tsc --noEmit KO) P1-review RÉSOLUtsc --noEmit exit 0 confirmé
E-02 Non-conformité spec ManifestIntegrityCheck absent du VerificationEngine P1-review RÉSOLUManifestService.revalidate() appelé dans runPostcheck() L282, rapport peuplé L314

MAJEURS résolus (2)

ID Type Constat Source Statut
E-03 Qualité code 12 erreurs ESLint (2 sécurité + 10 qualité) P1-review RÉSOLU — 0 erreur ESLint module migration
D-01 Régression test Regex READABILITY_RATE ^[01](\.\d{1,4})?$ accepte 1.0001-1.9999 P2-confrontation RÉSOLU — Regex corrigée en ^(0(\.\d{1,4})?|1(\.0{1,4})?)$ conforme §5.1
D-02 Traçabilité PD-254-code-contracts.yaml référence src/migration/ au lieu de src/modules/migration/ P2-confrontation RÉSOLU — Chemins mis à jour

MINEURS (4 — non bloquants, tracés comme dette)

ID Type Constat Source Impact
D-03 Convention attestation.service.ts:84 utilise JSON.stringify vs canonicalize() RFC 8785 dans manifest P2-confrontation Risque théorique reproductibilité inter-runtime. sign/verify utilisent la même sérialisation → pas de violation fonctionnelle.
D-04 Convention global-root-hash.check.ts:18 utilise localeCompare au lieu de comparaison byte-order P2-confrontation Correct pour hex lowercase ASCII pur dans les locales courantes. INV-254-09 recommande déterminisme strict.
D-05 Complétude WormGuard.canActivate() retourne toujours true, WormRetentionChecker non injecté P2-confrontation Protection WORM effective via service (MigrationCampaignService). Guard HTTP = squelette.
D-06 Intégration MigrationModule non enregistré dans AppModule P2-confrontation Attendu (TODO #10 décomposition). Hors périmètre PD-254.

Zones d'ombre (5)

ID Constat Impact
Z-01 Coverage code non mesuré (pas de --coverage) Impossible de vérifier couverture des chemins critiques
Z-02 TC-ERR-07 (timeout BullMQ) PARTIEL — config, pas E2E Risque de campagne bloquée en POSTCHECK_RUNNING
Z-03 Clearing conditionnel PASS mais WormGuard no-op Si endpoint HTTP expose action WORM sans passer par service, protection absente
Z-04 Regex attestation code de production non vérifiée in situ Tests utilisent regex corrigée, pas de preuve directe code prod
Z-05 Points Q-03/Q-04/Q-06 non figés (reproductibilité) Hors périmètre implémentation PD-254

4. Scoring

Critère 1 — Conformity (conformité spec ↔ code)

  • 2 BLOQUANTS résolus (E-01, E-02)
  • 2 MAJEURS résolus (D-01 regex, D-02 chemins)
  • INV-254-01 à INV-254-12 couverts par tests
  • Machine d'états conforme (TC-INV-10A/10B)
  • 4 MINEURS résiduels non bloquants
  • Score : 8.0 (tous écarts critiques corrigés, mineurs tracés)

Critère 2 — Test Coverage (couverture tests)

  • 44/45 TC PASS (TC-INV-07 rollback manuel hors scope automatisé)
  • TC-ERR-07 PARTIEL (config timeout, pas E2E)
  • Matrice : 11 invariants, 12 erreurs, 8 flux nominaux, 11 négatifs, 5 non-régression
  • Coverage code non mesuré (Z-01)
  • Regex corrigée → tous les tests de validation PASS
  • Score : 7.5 (coverage numérique non mesuré, 1 test ABSENT, 1 PARTIEL)

Critère 3 — Security (sécurité)

  • ESLint security : 0 erreur (detect-object-injection, detect-unsafe-regex corrigés)
  • WORM protection : effective via service, guard squelette (D-05 mineur)
  • Événement WORM_VIOLATION_BLOCKED émis correctement
  • Lock Redis + idempotence fonctionnels
  • Pas de vulnérabilité identifiée par les reviewers
  • Score : 8.0 (sécurité solide, guard incomplet mais protection effective)

Critère 4 — Maintainability (maintenabilité)

  • 25 fichiers source, architecture NestJS modulaire
  • Séparation checks/services/entities/schemas claire
  • Code contracts alignés sur l'arborescence réelle
  • MigrationModule non enregistré (D-06 — attendu, TODO tracé)
  • JSON.stringify vs canonicalize : incohérence convention (D-03)
  • localeCompare vs byte-order (D-04)
  • Score : 7.5 (architecture propre, quelques incohérences de convention)

5. Synthèse

Critère Score Justification
conformity 8.0 BLOQUANTS + MAJEURS tous résolus, 11/11 invariants couverts
test_coverage 7.5 44/45 PASS, coverage non mesuré, 1 ABSENT, 1 PARTIEL
security 8.0 ESLint sécurité résolu, WORM via service, lock+idemp OK
maintainability 7.5 Architecture modulaire, conventions mineures divergentes

Moyenne : 7.75/10 Score min : 7.5 (test_coverage, maintainability) Règle : Moyenne >= 7 MAIS au moins un score < 8 → RESERVE