PD-264 — Dossier de conformité (Gate 5 — AMBIGUITY v1)¶
Documents de référence¶
- Plan :
PD-264-plan.md - Review (Phase 1) :
PD-264-plan-review.md(ChatGPT) - Confrontation (Phase 2) :
PD-264-confrontation-step5.md(Claude) - Spec :
PD-264-specification.md(v3, Gate 3 GO) - Tests :
PD-264-tests.md(v3, Gate 3 GO)
Analyse croisée Review + Confrontation¶
Écart #1 — BLOQUANT proposé (ChatGPT) : TC-264-11 non réalisable¶
Position ChatGPT : Le plan fonde l'interdiction des transitions inverses sur "pas de méthode" plutôt que sur une API explicite de transition. TC-264-11 ne peut pas exécuter 5 tentatives explicites.
Position Claude : Convergence confirmée sur les 5 transitions interdites. Les tests unitaires vérifient via "tentative d'appel aux méthodes de transition qui refusent l'opération" (Plan §1 TASK-4).
Délibération : Le mécanisme est valide en test unitaire : on vérifie que l'API n'expose pas de chemin pour les transitions interdites (absence de méthode = rejet par construction) ET que les méthodes existantes refusent les séquences invalides (ex: appeler persistToken() depuis un état REJECTED → exception). Le plan précise un enum NonceValidationStatus et des méthodes qui vérifient l'état courant. TC-264-11 est réalisable comme test unitaire vérifiant les gardes de méthode. Reclassé de BLOQUANT → MAJEUR (le plan devrait expliciter le mécanisme de test plus clairement).
Écart #2 — MAJEUR (ChatGPT + Claude DIV-02/ZO-01) : Collision nonce 0x00...00¶
Les deux reviewers convergent sur ce point critique : si plusieurs tokens PD-55 ont nonce = NULL, le backfill uniforme 0x00...00 viole l'index UNIQUE.
Délibération : Écart MAJEUR légitime. Le plan doit soit confirmer H-01 (aucun token existant) soit proposer des nonces de remplissage uniques (ex: hash(id)).
Écart #3 — MAJEUR (ChatGPT) : CA-264-12 affaibli par skip nightly¶
Position ChatGPT : Le plan permet un "skip conditionnel" du nightly si TSA indisponible.
Position Claude (DIV-06) : Impact faible, détail d'intégration CI.
Délibération : Le skip ne compte pas comme succès (status unstable). CA-264-12 n'est pas affaibli, il est rendu réaliste face à l'indisponibilité d'un service externe. Le plan documente le comportement de dégradation gracieuse. Reclassé de MAJEUR → MINEUR.
Écart #4 — MAJEUR (ChatGPT) : H-01 non vérifié au Go/No-Go¶
Délibération : Légitime. Le Go/No-Go dit "À confirmer" puis conclut "GO". Le plan aurait dû marquer cela comme condition conditionnelle. Cependant, la Phase A de migration gère les deux cas (tokens existants et vierge). Maintenu MAJEUR — le plan devrait être plus rigoureux sur la vérification de H-01.
Écart #5 — MAJEUR (ChatGPT) : Sur-contrat code contracts¶
Délibération : Les code contracts ajoutent des contraintes d'implémentation (migration réversible, REJECTED in-memory) qui ne sont pas dans la spec mais découlent logiquement du plan. C'est le rôle des code contracts d'affiner la spec pour l'implémentation. Reclassé de MAJEUR → MINEUR.
Écart #6 — MAJEUR (ChatGPT + Claude DIV-02) : Nonce backfill non contractualisé¶
Délibération : Même cluster que #2. Le backfill 0x00...00 est une décision d'implémentation non spécifiée. Le plan la prend mais doit la rendre explicite et résoudre la collision. Regroupé avec #2.
Écarts confrontation supplémentaires¶
- DIV-01 (trigger désactivation) : Faible impact, détail d'implémentation. → MINEUR
- DIV-03 (TC-MIG absents du cahier de tests) : Moyen impact. Les TC-MIG sont des ajouts légitimes du plan. → MINEUR
- DIV-04 (H-03 worker PD-55 non vérifié) : Moyen impact. Hypothèse à vérifier. → MAJEUR
- DIV-05 (exit code ESCALADE) : Faible impact. → MINEUR
- ZO-02..06 : Mineurs, détails d'implémentation.
Synthèse des écarts v1¶
Écarts BLOQUANTS (0)¶
Aucun (reclassement du BLOQUANT ChatGPT → MAJEUR).
Écarts MAJEURS (3)¶
| # | Type | Réf. | Description |
|---|---|---|---|
| 1 | AMB | Plan TASK-4, TC-264-11 | Mécanisme de test des transitions interdites insuffisamment explicité |
| 2 | AMB | Plan TASK-1, ZO-01 | Collision nonce backfill 0x00 si tokens PD-55 multiples avec nonce NULL |
| 3 | HYP | Plan H-01/H-03 | Hypothèses migration non vérifiées (données existantes, worker PD-55) |
Écarts MINEURS (6)¶
| # | Type | Réf. | Description |
|---|---|---|---|
| 4 | DIV | CA-264-12, Plan nightly | Skip conditionnel = dégradation gracieuse documentée |
| 5 | DIV | Code contracts | Sur-contrat d'implémentation légitime |
| 6 | DIV | Plan TASK-1, trigger | Désactivation trigger non dans la spec |
| 7 | DIV | TC-MIG-01/02/03 | Ajouts plan non dans cahier de tests |
| 8 | AMB | Plan TASK-6, TC-264-07 | Convention exit code non contractualisée |
| 9 | AMB | ZO-02..06 | Zones d'ombre mineures (nommage SQL, Prolog, grep) |
Scoring (4 critères AMBIGUITY)¶
Feasibility (faisabilité du plan)¶
- Architecture claire : 7 TASKs bien découpées, dépendances identifiées
- Go/No-Go documenté (6/7 hypothèses OK, H-01 "À confirmer")
- Migration DDL en 3 phases réaliste
- Écart #2 (collision backfill) menace la faisabilité migration si tokens existants = -0.75
- Écart #3 (H-01/H-03 non vérifiés) = -0.5
- Score : 10 - 1×0.75 - 1×0.5 - 1×0.25 = 8.5
Coverage (couverture INV/CA)¶
- Checklist INV/CA 26/26 complète (§12)
- Mapping INV → mécanisme → composant → observable (§3)
- Mapping CA → mécanisme → composant → observable (§4)
- Mapping TC → mécanisme → point d'observation (§5)
- TC-MIG ajoutés pour adresser constats Gate 3 (R01/R02)
- Écart #1 (TC-264-11 mécanisme) = mécanisme décrit mais insuffisamment explicité = -0.5
- Score : 10 - 1×0.5 = 9.5
Risk_mitigation (atténuation des risques)¶
- 7 risques sécurité identifiés avec mitigations (§7)
- 8 hypothèses documentées avec impact si faux (§8)
- 5 points de vigilance explicites (§9)
- Hors périmètre clairement borné (§10)
- Écart #2 (collision nonce) = risque non mitigé = -1.0
- Écart #3 (hypothèses non vérifiées) = mitigation incomplète = -0.5
- Score : 10 - 1×1.0 - 1×0.5 = 8.5
Coherence (cohérence plan ↔ spec ↔ tests)¶
- Confrontation confirme convergence forte
- 10 convergences identifiées (§2 confrontation)
- 6 divergences (DIV-01..06) : principalement clarifications d'implémentation
- Écart #1 (TC-264-11) = divergence review/plan sur mécanisme = -0.5
- Mineurs (TC-MIG, trigger, convention exit) = 3×0.25
- Score : 10 - 1×0.5 - 3×0.25 = 8.75
Scores finaux¶
| Critère | Score |
|---|---|
| feasibility | 8.5 |
| coverage | 9.5 |
| risk_mitigation | 8.5 |
| coherence | 8.75 |
| Moyenne | 8.8125 |
Confrontation¶
La confrontation Claude confirme une convergence forte sur les 14 INV, 12 CA, 18 TC et 7 TASK. Les divergences identifiées (DIV-01 à DIV-06) sont principalement des clarifications d'implémentation ou des additions légitimes du plan.
Le point critique partagé par les deux reviewers est la collision potentielle des nonces de remplissage (DIV-02/ZO-01), adressable par une correction mineure de la stratégie de backfill.
Délibération¶
Le plan est structurellement solide, avec une couverture complète des invariants et critères d'acceptation. Les 3 écarts majeurs sont des questions de précision adressables par correction du plan sans refonte architecturale :
- #1 (TC-264-11) : Expliciter le mécanisme de test dans le plan.
- #2 (collision backfill) : Utiliser des nonces de remplissage uniques (
randomBytesouhash(id)) au lieu de0x00...00uniforme. - #3 (hypothèses) : Vérifier H-01 et H-03 avant implémentation.
Recommandation : Verdict déterministe à calculer.