1. Documents de référence
- Spécification : PD-275-specification.md v2 (ChatGPT gpt-5.3-codex, corrigée)
- Tests : PD-275-tests.md (ChatGPT gpt-5.3-codex, inchangé depuis v1)
- Review v2 : PD-275-review-step3-v2.md (Claude-p)
- Confrontation v2 : PD-275-confrontation-step3-v2.md (ChatGPT gpt-5.3-codex)
2. Écarts v1 corrigés (confirmé P1 + P2)
| ID v1 | Description | Correction v2 |
| HD-02 | Race condition revokeSigner/submitBatch | INV-275-11 + INV-275-12 (SELECT FOR UPDATE, serialisation) |
| RS-01 | Pas d'autorisation sur revokeSigner() | INV-275-09 (ADMIN/SIGNER_ADMIN), CA-04b, ERR-REVOKE-UNAUTHORIZED |
| C-01 | CA-02 ne couvre pas le chemin d'acceptation finalisation | CA-02b ajouté |
| RS-02 | revokedBy usurpable si paramètre appelant | INV-275-10 (dérivé JWT sub), CA-04c, ERR-REVOKEDBY-SPOOFING |
4/4 écarts v1 MAJEURS corrigés.
3. Écarts résiduels v2
Écarts MAJEURS (2 réels + 2 atténués)
| ID | Type | Description | Atténué ? |
| IST-05 | Traçabilité | Matrice de couverture tests (§2) non mise à jour pour INV-275-09/10/11/12 et CA-02b/04b/04c/05b. Tests T10-T13 existent dans spec mais non mappés dans doc tests | Non — écart réel entre spec v2 et tests v1 |
| DIV-01 | Divergence | TC-NOM-04 GIVEN dit "identité de révocation fournie pour revokedBy" vs INV-275-10 qui impose dérivation JWT | Non — divergence réelle spec/tests |
| A-01 | Ambiguïté | Modèle batch partiel (NON_FINALIZED non défini) | Oui — Q-02 reconnue |
| A-04 | Ambiguïté | Interface signer→batch non contractualisée | Oui — H-01 (PD-177) reconnue |
Note : HD-03 (seed fail-closed / Q-05) identifié par P1 est reclassé MINEUR — c'est une hypothèse opérationnelle reconnue (H-04/Q-05), pas un manque de spec.
Écarts MINEURS (12)
| ID | Type | Description |
| C-02 | Contradiction | Duplication tests (spec vs tests) |
| C-03 | Contradiction | Duplication critères |
| C-04 | Contradiction | Chevauchement CA |
| A-02 | Ambiguïté | Terminologie mineure |
| A-03 | Ambiguïté | Précision secondaire |
| IST-01 | Traçabilité | Méta-test vs test comportemental |
| IST-02 | Traçabilité | Mapping INV imprécis |
| IST-03 | Traçabilité | Matrice v1 imprécise |
| IST-04 | Traçabilité | Référence CA-02 vs CA-02b dans tests |
| NT-01 | Non testable | Invariant vacuement vrai |
| HD-03 | Hypothèse | Seed initial fail-closed (Q-05) |
| DIV-04 | Divergence | Traçabilité CA-02/CA-02b mineures |
4. Scoring
Méthode : Base 10, -1 par MAJEUR réel, -0.5 par MAJEUR atténué (question ouverte reconnue), -0.25 par MINEUR.
Completeness (exhaustivité spec)
- A-01 (Q-02 reconnue) : -0.5
- A-04 (H-01 reconnue) : -0.5
- 3 mineurs (A-02, A-03, HD-03) : -0.75
- Score : 10 - 0.5 - 0.5 - 0.75 = 8.25
Testability (testabilité des critères)
- IST-05 (matrice tests non à jour pour v2) : -1
- DIV-01 (TC-NOM-04 contradictoire INV-275-10) : -1
- C-02, C-03, C-04 (duplications) : -0.75
- NT-01 (invariant vacuement vrai) : -0.25
- Score : 10 - 1 - 1 - 0.75 - 0.25 = 7.0
Clarity (clarté et non-ambiguïté)
- DIV-04 (traçabilité CA-02/CA-02b) : -0.25
- IST-01, IST-02, IST-03, IST-04 : -1.0
- Score : 10 - 0.25 - 1.0 = 8.75
Traceability (traçabilité invariants ↔ tests)
- IST-05 (4 invariants v2 non mappés) : -1
- IST-04 (CA-02 vs CA-02b) : -0.25
- DIV-04 (mapping ambigu) : -0.25
- Score : 10 - 1 - 0.25 - 0.25 = 8.5
5. Résumé scoring
| Critère | Score v1 | Score v2 | Delta |
| completeness | 7.25 | 8.25 | +1.0 |
| testability | 8.0 | 7.0 | -1.0 |
| clarity | 7.0 | 8.75 | +1.75 |
| traceability | 9.25 | 8.5 | -0.75 |
| Moyenne | 7.875 | 8.125 | +0.25 |
6. Analyse convergence
- Delta = 8.125 - 7.875 = +0.25
- Delta < 0.5 ET mean >= 7 → STOP — convergence atteinte
- La spec v2 a corrigé les 4 écarts de sécurité/contractualisation (RS-01, RS-02, HD-02, C-01)
- Le score testability baisse car la confrontation v2 identifie précisément le décalage tests/spec v2
- Ce décalage (tests non mis à jour pour les invariants v2) est attendu : les tests seront alignés à l'étape 4 (plan) ou corrigés pre-Gate 5
7. Écarts à reporter
- IST-05 : Aligner matrice tests avec INV-275-09/10/11/12 avant Gate 5
- DIV-01 : Corriger TC-NOM-04 pour que revokedBy soit dérivé du JWT (pas fourni en entrée)