Aller au contenu

Voici la revue d'acceptabilité post-correction, basée sur l'audit factuel du code actuel.


PD-254 — Revue d'acceptabilité (post-correction)

1. Références

  • Spécification : PD-254-specification.md
  • Tests contractuels : PD-254-tests.md
  • Acceptabilité existante : PD-254-acceptability.md
  • Date de revue : 2026-03-13
  • Reviewer : Claude (auditeur indépendant, Gate 8)

2. Suivi des écarts (append-only)

[2026-03-13] — Suivi E-01

  • Statut précédent : OUVERT
  • Statut actuel : RÉSOLU
  • Justification factuelle :
  • npx tsc --noEmit termine avec 0 erreur
  • migration-state.enum.ts:29 : Map typé Map<MigrationState, ReadonlySet<MigrationState>> — compile sans erreur
  • attestation.service.ts:92 : spread attestationPayload conforme à l'interface MigrationAttestation — plus d'erreur TS2322
  • migration-campaign.service.ts:174 : imports relatifs ../ résolus correctement — plus d'erreur TS2307
  • Preuve de vérification :
  • npx tsc --noEmit exit 0 (exécuté 2026-03-13)
  • Fichiers vérifiés : src/modules/migration/enums/migration-state.enum.ts, src/modules/migration/services/attestation.service.ts, src/modules/migration/services/migration-campaign.service.ts

[2026-03-13] — Suivi E-02

  • Statut précédent : OUVERT
  • Statut actuel : RÉSOLU
  • Justification factuelle :
  • ManifestService.revalidate() est appelé par MigrationCampaignService.runPostcheck() à la ligne 282
  • Le champ manifestIntegrityCheck du VerificationReport est peuplé à la ligne 314 : report.manifestIntegrityCheck = { passed: manifestResult.valid }
  • Le choix architectural (appel au niveau orchestrateur plutôt que dans le VerificationEngine) est légitime : la revalidation du manifest est une précondition du postcheck, pas un check parmi d'autres
  • INV-254-12 est satisfait : le manifest est vérifié (hash + signature) au début du postcheck et le résultat est dans le rapport
  • Preuve de vérification :
  • src/modules/migration/services/migration-campaign.service.ts:282 (appel revalidate)
  • src/modules/migration/services/migration-campaign.service.ts:314 (peuplement rapport)
  • TC-INV-12 PASS (manifest.service.spec.ts)

[2026-03-13] — Suivi E-03

  • Statut précédent : OUVERT
  • Statut actuel : RÉSOLU
  • Justification factuelle :
  • npm run lint retourne 0 erreur dans le module migration
  • Les 2 erreurs de sécurité (detect-object-injection, detect-unsafe-regex dans readability.check.ts) sont corrigées
  • Les 10 erreurs no-unused-vars, require-await, no-unsafe-* sont corrigées
  • 5 warnings subsistent dans d'autres modules (hors périmètre PD-254)
  • Preuve de vérification :
  • npm run lint exécuté 2026-03-13 — 0 erreur module migration

[2026-03-13] — Suivi E-04

  • Statut précédent : OUVERT
  • Statut actuel : OUVERT
  • Justification factuelle :
  • Les fichiers sont confirmés à src/modules/migration/ (arborescence complète vérifiée)
  • Aucune preuve que PD-254-code-contracts.yaml a été mis à jour pour refléter les chemins corrects
  • L'écart de traçabilité entre contracts et code persiste en l'absence de preuve de correction du YAML
  • Preuve de vérification :
  • Arborescence src/modules/migration/ confirmée par audit (16+ fichiers)
  • PD-254-code-contracts.yaml non vérifié dans cette revue

[2026-03-13] — Suivi E-05

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • attestation.service.ts:84 utilise toujours JSON.stringify(attestationPayload)
  • manifest.service.ts:95 utilise canonicalize() (RFC 8785 JCS)
  • Divergence de convention persistante : payload signé sérialisé de manière non-déterministe
  • Preuve de vérification :
  • src/modules/migration/services/attestation.service.ts:84JSON.stringify confirmé

[2026-03-13] — Suivi E-06

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • global-root-hash.check.ts:18 utilise toujours a.localeCompare(b) pour le tri des merkle_root
  • Risque de non-reproductibilité (INV-254-09) en environnement avec locale non-ASCII
  • Fonctionnel pour l'instant (hex lowercase ASCII) mais non conforme à la rigueur contractuelle
  • Preuve de vérification :
  • src/modules/migration/checks/global-root-hash.check.ts:18localeCompare confirmé

[2026-03-13] — Suivi E-07

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • worm.guard.ts:43-62 : canActivate() retourne toujours true
  • WormRetentionChecker est défini (interface + token) mais ni injecté dans le constructeur ni appelé
  • Le guard NestJS est un no-op ; la détection est déléguée au MigrationCampaignService
  • L'événement WORM_VIOLATION_BLOCKED est émis via emitViolation() (lignes 70-85) mais uniquement quand appelé explicitement par le service
  • Preuve de vérification :
  • src/modules/migration/guards/worm.guard.ts — code source audité

[2026-03-13] — Suivi E-08

  • Statut précédent : OUVERT
  • Statut actuel : NON RÉSOLU
  • Justification factuelle :
  • MigrationModule absent de src/app.module.ts (grep négatif)
  • Le module est isolé et ne peut pas être bootstrappé par NestJS en l'état
  • Attendu (TODO #10 décomposition) mais non réalisé
  • Preuve de vérification :
  • grep MigrationModule src/app.module.ts — aucun résultat

2bis. Régression détectée (hors écarts existants)

Note factuelle (ne constitue pas un nouvel écart) : l'exécution des tests post-correction révèle 224/225 PASS, 1 FAIL (contre 225/225 dans l'acceptabilité initiale).

  • Test en échec : validation.spec.ts:137READABILITY_RATE regex accepte 1.0001 (attendu : rejet)
  • Cause : regex /^[01](\.\d{1,4})?$/ valide tout 1.XXXX y compris 1.0001..1.9999, au lieu de contraindre à 0.0000..1.0000
  • Impact : la condition de levée « Tests toujours 225/225 PASS après corrections » n'est PAS satisfaite

3. Verdict d'acceptabilité (courant)

Verdict actuel : ⚠️ ACCEPTÉ AVEC RÉSERVES

Date : 2026-03-13

Motif synthétique : Les 2 écarts BLOQUANTS (E-01, E-02) sont RÉSOLUS. L'écart MAJEUR E-03 est RÉSOLU. Cependant : (1) 1 régression de test (regex READABILITY_RATE), (2) E-04 MAJEUR non vérifié, (3) 4 écarts MINEURS persistants (E-05 à E-08). Aucun invariant n'est violé en l'état, mais la condition « 225/225 tests PASS » n'est pas remplie.

Réserves actives

ID Écart Gravité Action requise
R-01 Régression test READABILITY_RATE (224/225) MAJEUR Corriger regex pour rejeter 1.0001..1.9999
R-02 E-04 — Chemins code-contracts non vérifiés MAJEUR Confirmer mise à jour PD-254-code-contracts.yaml
R-03 E-05 — Attestation JSON.stringify vs JCS MINEUR Aligner sur RFC 8785 comme le manifest
R-04 E-06 — GRH localeCompare MINEUR Remplacer par comparaison byte-order stricte
R-05 E-07 — WormGuard no-op MINEUR Injecter WormRetentionChecker ou documenter le choix
R-06 E-08 — MigrationModule non enregistré MINEUR Enregistrer dans AppModule ou documenter comme TODO

4. Historique des verdicts

Date Verdict Version / commit Commentaire
2026-03-13 ⛔ REFUSÉ HEAD main (initial) 2 BLOQUANTS (E-01 TSC, E-02 INV-254-12), 225/225 tests
2026-03-13 ⚠️ ACCEPTÉ AVEC RÉSERVES HEAD main (post-correction) BLOQUANTS résolus, 224/225 tests (1 régression), 4 MINEURS persistants