Aller au contenu

PD-254 — Acceptabilite

1. References

  • Specification : PD-254-specification.md
  • Tests contractuels : PD-254-tests.md
  • Plan d'implementation : PD-254-plan.md
  • Code contracts : PD-254-code-contracts.yaml
  • Commit / version evaluee : HEAD main (ProbatioVault-backend) + HEAD main (ProbatioVault-doc)
  • Date de la revue : 2026-03-13
  • Gate 3 : RESERVE v2 (7.625/10) — 2 bloquants residuels (R-01, R-02) traites par H-T01/H-T02
  • Gate 5 : RESERVE v1 (8.0/10) — risk_mitigation 7.5

2. Synthese executive

PD-254 est une story hybride couvrant la documentation d'un protocole de migration probatoire (ProbatioVault-doc) et l'implementation du moteur de verification (ProbatioVault-backend).

Resultats :

  • 225 tests unitaires passes (9 suites, 0 echec)
  • 3 erreurs TypeScript dans le module migration (compilation echoue)
  • 12 erreurs ESLint dans le module migration (dont 2 securite)
  • 1 ecart d'invariant : ManifestIntegrityCheck absent du VerificationEngine
  • Document protocole : present et complet (3 types de migration)
  • MigrationModule non enregistre dans AppModule (attendu — TODO integration)

Conclusion : le module est fonctionnellement solide (225/225 tests), mais ne compile pas en l'etat et presente un ecart d'invariant sur INV-254-12.

3. Resultats des tests contractuels

3.1 Reviews automatisees

Outil Resultat Detail
TypeScript (npx tsc --noEmit) FAIL 3 erreurs dans le module migration
ESLint (npm run lint) FAIL 12 erreurs dans le module migration (dont 2 securite)
Tests (npx jest --testPathPattern=migration) PASS 225/225 tests, 9 suites
Prettier N/A Non execute (bloque par echec TSC)
Coverage N/A Non mesure (pas de --coverage sur run isole)

3.2 Erreurs TypeScript (3)

Fichier Erreur Impact
enums/migration-state.enum.ts:29 TS2769 — Overload mismatch sur Map constructor (VALID_TRANSITIONS) BLOQUANT — compilation echoue
services/attestation.service.ts:92 TS2322 — verdict: string incompatible avec "GO" \| "KO" BLOQUANT — typage literal manquant
services/migration-campaign.service.ts:174 TS2307 — Module ../checks/global-root-hash.check introuvable BLOQUANT — import path incorrect

3.3 Erreurs ESLint (12 dans le module migration)

Fichier Regle Gravite
checks/readability.check.ts:57 security/detect-object-injection Securite
checks/readability.check.ts:57 security/detect-unsafe-regex Securite
guards/worm.guard.ts:43 @typescript-eslint/require-await Erreur
migration.module.ts:5 @typescript-eslint/no-unused-vars (EventEmitterModule) Erreur
ports/log-notification.adapter.ts:12 @typescript-eslint/require-await Erreur
processors/reconciliation.processor.ts:30 @typescript-eslint/no-unused-vars (job) Erreur
services/attestation.service.ts:3 @typescript-eslint/no-unused-vars (HSM_SIGNER_TOKEN) Erreur
services/clearing.service.ts:5 @typescript-eslint/no-unused-vars (BOUNDS) Erreur
services/migration-campaign.service.ts:7 @typescript-eslint/no-unused-vars (TransitionResult) Erreur
services/migration-campaign.service.ts:174,176,184,193 @typescript-eslint/no-unsafe-* (4 occurrences) Erreur
services/verification-engine.service.ts:12 @typescript-eslint/no-unused-vars (ManifestObject) Erreur
constants/migration.constants.ts:31 @typescript-eslint/no-unused-vars (DEFAULTS) Erreur

3.4 Tests contractuels — matrice de couverture

Test ID Statut Preuve d'execution Commentaire
TC-NOM-01 PASS protocole-migration-probatoire.md present, 3 sections migration Document valide
TC-NOM-02 PASS manifest.service.spec.ts Schema §5.14, manifest_hash, manifest_signature
TC-NOM-03 PASS checks.spec.ts SHA3/Merkle/GRH/ancrage/lisibilite
TC-NOM-04 PASS attestation.service.spec.ts Attestation signee, protocol_version, manifest_hash
TC-NOM-05 PASS checks.spec.ts (dry-run source/source) Mode dry-run verifie
TC-NOM-06 PASS scripts/migration-gate.sh present Script CI quality gate
TC-NOM-07 PASS campaign.service.spec.ts Lock/idempotence/reconciliation
TC-NOM-08 PASS Ensemble artefacts Dossier audit correle par migration_id
TC-ERR-01 PASS manifest.service.spec.ts INVALID_MANIFEST, aucune transition
TC-ERR-02 PASS checks.spec.ts SHA3 mismatch → KO, doc_id fautif
TC-ERR-03 PASS checks.spec.ts Merkle mismatch → KO
TC-ERR-04 PASS checks.spec.ts Ancrage KO, taux < 100%
TC-ERR-05 PASS checks.spec.ts Lisibilite sous seuil → KO
TC-ERR-06 PASS campaign.service.spec.ts CONCURRENT_EXECUTION_DENIED
TC-ERR-07 PARTIEL Couvert par config timeout Integration BullMQ timeout non teste end-to-end
TC-ERR-08 PASS attestation.service.spec.ts ATTESTATION_FAILED, rollback
TC-ERR-09 PASS worm.guard.spec.ts WORM_VIOLATION_BLOCKED emis
TC-ERR-10 PASS manifest.service.spec.ts Donnee inter-module manquante → KO
TC-ERR-11 PASS manifest.service.spec.ts Manifest altere → KO immediate
TC-ERR-12 PASS checks.spec.ts TOCTOU source_object_count → MANIFEST_STALE
TC-INV-01 PASS checks.spec.ts sha3_before == sha3_after
TC-INV-02 PASS checks.spec.ts merkle_root identiques
TC-INV-03 PASS checks.spec.ts GRH tri lexico hex lowercase
TC-INV-04 PASS checks.spec.ts Ancrage 100%
TC-INV-05 PASS checks.spec.ts 3 criteres lisibilite
TC-INV-06 PASS worm.guard.spec.ts WORM_VIOLATION_BLOCKED
TC-INV-07 ABSENT Manuel (exercice rollback) Hors scope automatise
TC-INV-08 PASS attestation.service.spec.ts Signature + archivage + schema §5.14
TC-INV-09 PASS campaign.service.spec.ts Replay idempotent
TC-INV-10A PASS migration-state-machine.spec.ts Matrice exhaustive transitions
TC-INV-10B PASS migration-state-machine.spec.ts Etats terminaux fermes
TC-INV-12 PASS manifest.service.spec.ts Hash + signature HSM revalides
TC-CLR-01 PASS clearing.service.spec.ts Compteur N cycles, remise a zero
TC-TOCTOU-01 PASS checks.spec.ts source_object_count divergence
TC-GRH-SORT-01 PASS checks.spec.ts Ordre B, C, A verifie
TC-LISIB-01 PASS checks.spec.ts 5 objets, pass_rate=0.4000, criteres identifies
TC-CODES-METIER-01 PASS migration-state-machine.spec.ts INVALID_INPUT, aucune transition
TC-PRECHECK-EXP-01 PASS migration-state-machine.spec.ts TTL expire → PRECHECK_EXPIRED → DRAFT
TC-NEG-01..11 PASS campaign.service.spec.ts, validation.spec.ts, manifest.service.spec.ts Rejets adversariaux conformes
TC-NR-01..05 PASS Tests existants inchanges Aucune regression detectee

Bilan : 44/45 tests PASS, 1 ABSENT (TC-INV-07 manuel), 1 PARTIEL (TC-ERR-07 timeout integration).

4. Ecarts identifies

Classification des ecarts

Niveau Definition
BLOQUANT Violation d'invariant, faille de securite, non-conformite majeure
MAJEUR Fonction incomplete ou non conforme sans rupture de securite
MINEUR Detail ou dette non critique

Detail des ecarts

ID Description Reference Gravite Statut
E-01 3 erreurs TypeScript — le module migration ne compile pas. (a) TS2769 sur VALID_TRANSITIONS Map constructor, (b) TS2322 verdict string vs "GO"\|"KO", © TS2307 import path ../checks/global-root-hash.check introuvable Build BLOQUANT OUVERT
E-02 ManifestIntegrityCheck non execute dans VerificationEngine — le champ manifestIntegrityCheck est declare optionnel dans VerificationReport mais jamais peuple. La revalidation du manifest (INV-254-12) est implementee dans ManifestService.revalidate() mais n'est pas appelee par le VerificationEngine. Le rapport de verification est donc incomplet. INV-254-12, CA-16 BLOQUANT OUVERT
E-03 12 erreurs ESLint dont 2 de securite (detect-object-injection, detect-unsafe-regex dans readability.check.ts). Les 10 autres sont des no-unused-vars, require-await et no-unsafe-* ESLint MAJEUR OUVERT
E-04 Chemins code contracts divergents — les contracts referencent src/migration/ mais les fichiers sont a src/modules/migration/. Ecart de tracabilite. PD-254-code-contracts.yaml MAJEUR OUVERT
E-05 Attestation serialisee via JSON.stringify, pas RFC 8785 (JCS) — contrairement au manifest qui utilise la canonicalisation RFC 8785. Pas de violation fonctionnelle (sign et verify utilisent la meme serialisation), mais divergence de convention. §5.14, AD-01 MINEUR OUVERT
E-06 GRH tri via localeCompare au lieu de comparaison stricte byte-order — fonctionne pour ASCII hex lowercase mais n'est pas locale-safe. Risque theorique en environnement avec locale exotique. INV-254-03, §3 MINEUR OUVERT
E-07 WormGuard.canActivate() retourne toujours true — le guard ne bloque pas autonomement, il delegue la detection de violation au service appelant. L'evenement WORM_VIOLATION_BLOCKED est emis correctement mais le guard NestJS ne remplit pas son role de garde d'acces. INV-254-06 MINEUR OUVERT
E-08 MigrationModule non enregistre dans AppModule — attendu (TODO #10 decomposition) mais empecherait le module de fonctionner si deploye en l'etat. Integration MINEUR OUVERT

5. Hypotheses et TODO recenses

Hypotheses complementaires

ID Hypothese Origine
H-T01 MANIFEST_STALE traite comme 6e code metier (non dans spec §3/§5.2) R-01 Gate 3
H-T02 POSTCHECK_RUNNING → ROLLED_BACK (pas → DRAFT) pour MANIFEST_STALE R-02 Gate 3
H-T03 Canonicalisation JSON via RFC 8785 (JCS) pour le manifest R-03 Gate 3
H-T04 Detection PRECHECK_EXPIRED en mode LAZY (au moment du cutover) R-05 Gate 3
H-T05 readability_sample_count hors bornes → clamp au max R-06 Gate 3
H-T06 Exit codes CI : 0=GO, 1=KO, 2=erreur technique Q-06

TODO restants (non bloquants pour Gate 8)

# Item Impact
1 TC-INV-07 : exercice rollback (test manuel) Mesure delai — hors scope auto
2 TC-ERR-07 : timeout BullMQ integration Couvert par config, non E2E
3 Q-03 : endpoint blockchain de reference Mock utilise
4 Q-04 : politique sampling (uniforme vs stratifie) Uniforme par defaut
5 Q-05 : canal notification DevOps LogNotificationAdapter
6 Q-07 : localisation archivage attestation Parametrable
7 Q-08 : double signature attestation Signature HSM unique
8 AppModule registration (E-08) TODO integration

6. Verdict d'acceptabilite (unique)

Verdict : REFUSE

Date : 2026-03-13

Motif synthetique : 2 ecarts BLOQUANTS non resolus :

  1. E-01 — Le module migration ne compile pas (3 erreurs TypeScript). Toute soumission a Gate 8 avec un build casse sera rejetee.
  2. E-02 — L'invariant INV-254-12 (integrite du manifest) est partiellement implemente : ManifestService.revalidate() existe mais n'est pas invoque par le VerificationEngine. Le rapport de verification produit par le moteur est incomplet sur ce point.

Actions correctives requises avant re-soumission

  1. Corriger les 3 erreurs TypeScript (E-01) :
  2. migration-state.enum.ts : caster le Map constructor avec as Map<MigrationState, Set<MigrationState>>
  3. attestation.service.ts : typer verdict comme 'GO' | 'KO' au lieu de string
  4. migration-campaign.service.ts : corriger le chemin d'import du check GRH
  5. Integrer ManifestIntegrityCheck dans VerificationEngine (E-02) : appeler ManifestService.revalidate() au debut de postcheck() et peupler le champ manifestIntegrityCheck du rapport.
  6. Corriger les 2 erreurs ESLint de securite (E-03 partiel) : detect-object-injection et detect-unsafe-regex dans readability.check.ts.
  7. Corriger les imports/variables inutilises (E-03 restant) : supprimer les imports morts.

Conditions de levee (si reserves apres corrections)

  • Build TypeScript sans erreur (npx tsc --noEmit exit 0)
  • ESLint sans erreur dans le module migration (npm run lint — 0 erreur migration)
  • ManifestIntegrityCheck present dans le rapport du VerificationEngine
  • Tests toujours 225/225 PASS apres corrections