Date : 2026-02-25 Story : PD-250 — Job destruction définitive et bordereau Iteration : v4 (post-ESCALADE, correction directe Claude, décision PO) Documents audités : PD-250-specification.md (v4), PD-250-tests.md (v4)
Sources
- Review (P1) : PD-250-specification-review.md (Claude, v4) — 0 BLOQUANT, 7 MAJEURS, 5 MINEURS
- Confrontation (P2) : PD-250-confrontation-step3.md (ChatGPT, v4) — 2 divergences, 5 zones d'ombre
Bilan des corrections v3 → v4
| Écart v3 | Statut v4 | Détail |
| ECT-06 (RECONCILIATION_FAILED absent modèle formel) | CORRIGÉ | §10.5 : état de document, transitions, complétude audit documentés |
| MAJ-18 (borne temporelle bordereau→destruction) | CORRIGÉ | §5.5 : délai borné par destructionExecutionSla |
| MAJ-19 (PARTIAL_FAILED terminologie) | CORRIGÉ | §5.9 : « finaux pour le batch courant », reprise = nouveau batch |
| MAJ-20 (reconciliationSla non testé) | CORRIGÉ | TC-250-28 ajouté |
| MAJ-21 (confirmation S3 non contractualisée) | CORRIGÉ | §5.5 : HTTP 204 = confirmation, eventual consistency acceptée |
| MAJ-22 (monotonie timestamps) | CORRIGÉ | INV-250-05 : séquence PostgreSQL audit_seq |
| MAJ-23 (TC-250-25 non déterministe) | CORRIGÉ | ERR-250-03 + TC-250-25 → batch PARTIAL_FAILED (déterministe) |
| MAJ-24 (parentBatchId optionnel) | CORRIGÉ | §5.9 : parentBatchId obligatoire pour batches de reprise |
| MIN-04 (SLA sans INV/CA) | CORRIGÉ | INV-250-16 + CA-250-16 ajoutés, TC-250-26/27/28 rattachés |
| MIN-05 (préavis N=0) | CORRIGÉ | §5.8 : job dédié + cas N=0 documenté |
| MIN-06 (protection WORM bordereau) | CORRIGÉ | §5.7 : WORM DB + SEALED sans expiration + Object Lock |
| MIN-07 (séquence zeroization) | CORRIGÉ | §5.5 : zeroization → S3 → DB, séquence stricte |
| MIN-08 (déclencheur préavis) | CORRIGÉ | §5.8 : job BullMQ dédié quotidien |
| MIN-09 (clockSkewTolerance TSA) | CORRIGÉ | §5.1 : non applicable à TSA, RFC 3161 accuracy |
| MIN-10 (métriques accès) | CORRIGÉ | §5.10 : restriction ADMIN/SYSTEM, compteurs agrégés |
Résultat : 15/15 écarts v3 corrigés. Progression majeure.
Synthèse des écarts consolidés (v4)
Écarts BLOQUANTS (0)
Aucun.
Écarts MAJEURS (4)
| # | Écart | Type | Source |
| MAJ-25 | §10.4 « Async post-validation » vs §5.5 await séquentiel — terminologie trompeuse. Le terme « Async » dans le tableau §10.4 contredit la description séquentielle de §5.5. | AMB | Review P1 (#2) |
| MAJ-26 | destructionExecutionSla → FAILED (§5.5, avant 1er doc) vs PARTIAL_FAILED (§10.3/TC-250-27, en cours de traitement). Contradiction sur le comportement selon le moment du dépassement. | ECT | Review P1 (#4) + Confrontation P2 (DIV-02) |
| MAJ-27 | Fail-closed sur échec zeroization (§5.5 flux legal_lock) non couvert par test explicite. | DIV | Review P1 (#5) |
| MAJ-28 | RECONCILIATION_FAILED : transitions depuis cet état non couvertes par INV-250-11 ni TC-250-15. Le modèle §10.5 dit RECONCILIATION_FAILED → * : INTERDITE mais INV-250-11 ne le liste pas. | DIV | Review P1 (#12) |
Écarts MINEURS (5)
| # | Écart | Type | Source |
| MIN-11 | parentBatchId obligatoire (§5.9) sans test explicite dédié. | DIV | Review P1 (#3) + Confrontation P2 (zone d'ombre) |
| MIN-12 | Restriction consommation batch_result aux rôles ADMIN/SYSTEM (§5.10) non couverte par test. | DIV | Review P1 (#8) + Confrontation P2 (zone d'ombre) |
| MIN-13 | Mécanisme d'exclusion du bordereau de la sélection d'éligibilité non formalisé explicitement (INV-250-06 dit « pas de retentionExpiry » mais le filtre de sélection n'exclut pas explicitement les types bordereau). | SEC | Review P1 (#11) |
| MIN-14 | eIDAS qualification : test automatisé (TC-250-08) vs contrôle opérationnel (§3 non testable) — ambiguïté sur la preuve en gate. | AMB | Confrontation P2 (DIV-01) |
| MIN-15 | Couvertures « Complète » dans matrice malgré échantillonnage pour bornes de configuration. | AMB | Confrontation P2 (zone d'ombre) |
completeness (Exhaustivité de la couverture spec↔tests)
- Base 10
- MAJ-27 : -1 (fail-closed zeroization non testé)
- MAJ-28 : -1 (RECONCILIATION_FAILED transitions non couvertes INV-250-11/TC-250-15)
- MIN-11 : -0.25 (parentBatchId non testé)
- MIN-12 : -0.25 (restriction batch_result non testée)
- Score : 7.5
testability (Testabilité des exigences)
- Base 10
- MIN-14 : -0.25 (eIDAS preuve ambiguë)
- MIN-15 : -0.25 (couverture par échantillonnage)
- Score : 9.5
clarity (Clarté et non-ambiguïté de la spécification)
- Base 10
- MAJ-25 : -1 (terminologie Async trompeuse)
- MAJ-26 : -1 (FAILED vs PARTIAL_FAILED sur destructionExecutionSla)
- MIN-13 : -0.25 (exclusion bordereau de sélection non formalisée)
- Score : 7.75
traceability (Traçabilité spec→tests→invariants)
- Base 10
- MIN-11 : -0.25 (parentBatchId non tracé en test)
- Score : 9.75
Scores finaux
| Critère | Score |
| completeness | 7.5 |
| testability | 9.5 |
| clarity | 7.75 |
| traceability | 9.75 |
| Moyenne | 8.625 |
Analyse de convergence
| Metric | v1 | v2 | v3 | v4 |
| Score moyen | 5.75 | 7.31 | 7.31 | 8.625 |
| Bloquants | 4 | 1 | 1 | 0 |
| Majeurs | 9 | 8 | 7 | 4 |
| Mineurs | 0 | 3 | 7 | 5 |
Delta : 8.625 - 7.31 = 1.315 (amélioration significative) Clarity : 3.0 → 7.75 (+4.75, le critère bloquant est résolu) Tous scores >= 7 : OUI Au moins un score < 8 : OUI (completeness=7.5, clarity=7.75) Verdict préliminaire : RESERVE (mean >= 7, tous >= 6, mais completeness et clarity < 8)