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 :
- E-01 — Le module migration ne compile pas (3 erreurs TypeScript). Toute soumission a Gate 8 avec un build casse sera rejetee.
- 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¶
- Corriger les 3 erreurs TypeScript (E-01) :
migration-state.enum.ts: caster le Map constructor avecas Map<MigrationState, Set<MigrationState>>attestation.service.ts: typer verdict comme'GO' | 'KO'au lieu destringmigration-campaign.service.ts: corriger le chemin d'import du check GRH- Integrer ManifestIntegrityCheck dans VerificationEngine (E-02) : appeler
ManifestService.revalidate()au debut depostcheck()et peupler le champmanifestIntegrityCheckdu rapport. - Corriger les 2 erreurs ESLint de securite (E-03 partiel) :
detect-object-injectionetdetect-unsafe-regexdansreadability.check.ts. - 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 --noEmitexit 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