1. Documents de référence
- Spécification : PD-275-specification.md v2
- Tests : PD-275-tests.md v2
- Plan : PD-275-plan.md (Claude-p)
- Code contracts : PD-275-code-contracts.yaml (Claude-p)
- Review : PD-275-review-step5-v1.md (ChatGPT gpt-5.3-codex)
- Confrontation : PD-275-confrontation-step5-v1.md (Claude-p)
2. Synthèse des écarts
Écarts BLOQUANTS (1)
| ID | Type | Description | Analyse |
| BLK-01 | Réalisabilité | FT4 séquencement : contrôle signer intervient après création batch dans le flux planifié. TC-NOM-06/07 exigent "aucun batch créé" si signer REVOKED/inconnu. | Écart réel — le plan doit garantir que le contrôle signer est évalué AVANT toute création de batch dans submitBatch(). Le code du service doit commencer par assertSignerActive() avant buildBatch(). |
Écarts MAJEURS (3)
| ID | Type | Description | Analyse |
| MAJ-01 | Non-conformité | SignerActiveGuard (C8) comme garde NestJS route contradictoire avec INV-275-11 (transaction + FOR UPDATE) et avec l'architecture BullMQ worker | P1 et P2 convergent. Le guard HTTP est un pré-contrôle sans transaction — le vrai contrôle transactionnel est dans le service. C8 devrait être supprimé ou reclassé comme optimisation non contractuelle. |
| MAJ-02 | Hypothèse | Autorisation revokeSigner() portée uniquement par @Roles au controller — appels service-to-service non protégés | Écart réel mais atténué : dans le périmètre PD-275, revokeSigner() n'est exposé que via le controller. L'ajout d'une assertion au niveau service est une bonne pratique mais pas bloquante. |
| MAJ-03 | Complétude | C8 (SignerActiveGuard) absent des code contracts | Confirmé P1 + P2 (ZO-01). Si C8 est supprimé (cf. MAJ-01), l'écart disparaît. |
Écarts MINEURS (5)
| ID | Type | Description |
| MIN-01 | Terminologie | PENDING_FINALITY (plan) vs NON_FINALIZED (spec) — DIV-02 |
| MIN-02 | Traçabilité | Dépendances inter-PD sans statut normalisé |
| MIN-03 | Technique | Variables CI non documentées |
| MIN-04 | Duplication | Tests TC-ERR-02/04/05 doublons de TC-NOM — DIV-04 |
| MIN-05 | Divergence | ERR-SIGNER-NOT-FOUND implicite dans F3 — DIV-05 |
3. Scoring
Gate 5 — AMBIGUITY : feasibility, coverage, risk_mitigation, coherence.
Feasibility (faisabilité du plan)
- BLK-01 (séquencement FT4) : -2
- MAJ-01 (SignerActiveGuard contradictoire) : -1
- Score : 10 - 2 - 1 = 7.0
Coverage (couverture spec/tests par le plan)
- MAJ-03 (C8 sans code contract) : -1
- MIN-04 (duplication tests) : -0.25
- Score : 10 - 1 - 0.25 = 8.75
Risk Mitigation (gestion des risques)
- MAJ-02 (autorisation service-level absente) : -1
- MIN-02 (dépendances sans statut) : -0.25
- MIN-03 (variables CI) : -0.25
- Score : 10 - 1 - 0.25 - 0.25 = 8.5
Coherence (cohérence plan/spec/tests)
- MIN-01 (terminologie PENDING_FINALITY) : -0.25
- MIN-05 (ERR-SIGNER-NOT-FOUND implicite) : -0.25
- Score : 10 - 0.25 - 0.25 = 9.5
4. Résumé scoring
| Critère | Score |
| feasibility | 7.0 |
| coverage | 8.75 |
| risk_mitigation | 8.5 |
| coherence | 9.5 |
| Moyenne | 8.4375 |
5. Écarts à corriger
- BLK-01 : Réordonner FT4 —
assertSignerActive() DOIT précéder buildBatch() dans submitBatch() - MAJ-01 : Supprimer C8 (SignerActiveGuard) ou le reclasser comme optimisation non contractuelle
- MAJ-02 : Ajouter assertion autorisation dans
SignerRegistryService.revokeSigner() en complément du @Roles - MAJ-03 : Résolu si C8 est supprimé (cf. MAJ-01)