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 --noEmittermine avec 0 erreurmigration-state.enum.ts:29: Map typéMap<MigrationState, ReadonlySet<MigrationState>>— compile sans erreurattestation.service.ts:92: spreadattestationPayloadconforme à l'interfaceMigrationAttestation— plus d'erreur TS2322migration-campaign.service.ts:174: imports relatifs../résolus correctement — plus d'erreur TS2307- Preuve de vérification :
npx tsc --noEmitexit 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é parMigrationCampaignService.runPostcheck()à la ligne 282- Le champ
manifestIntegrityCheckduVerificationReportest 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 lintretourne 0 erreur dans le module migration- Les 2 erreurs de sécurité (
detect-object-injection,detect-unsafe-regexdansreadability.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 lintexé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.yamla é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.yamlnon 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:84utilise toujoursJSON.stringify(attestationPayload)manifest.service.ts:95utilisecanonicalize()(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:84—JSON.stringifyconfirmé
[2026-03-13] — Suivi E-06¶
- Statut précédent : OUVERT
- Statut actuel : NON RÉSOLU
- Justification factuelle :
global-root-hash.check.ts:18utilise toujoursa.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:18—localeCompareconfirmé
[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 toujourstrueWormRetentionCheckerest 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_BLOCKEDest émis viaemitViolation()(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 :
MigrationModuleabsent desrc/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:137—READABILITY_RATEregex accepte1.0001(attendu : rejet) - Cause : regex
/^[01](\.\d{1,4})?$/valide tout1.XXXXy compris1.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 |