PD-52 — Confrontation Gate 5¶
Story : PD-52 — Setup connexion Ethereum L2 (Polygon/Arbitrum) Gate : 5 — AMBIGUITY (Review Plan) Date : 2026-02-12 Contre-auditeur : Claude Opus 4.5 (subprocess)
Synthèse¶
| Écart | Verdict | Gravité initiale | Gravité finale |
|---|---|---|---|
| ECT-PLAN-01 | RÉDUIT | BLOQUANT | MAJEUR |
| ECT-PLAN-02 | RÉVOQUÉ | MAJEUR | N/A |
| ECT-PLAN-03 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-04 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-05 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-06 | RÉDUIT | BLOQUANT | MAJEUR |
| ECT-PLAN-07 | RÉDUIT | BLOQUANT | MAJEUR |
| ECT-PLAN-08 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-09 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-10 | RÉDUIT | MAJEUR | MINEUR |
| ECT-PLAN-11 | RÉVOQUÉ | MAJEUR | N/A |
| ECT-PLAN-12 | MAINTENU | MAJEUR | MAJEUR |
| ECT-PLAN-13 | RÉVOQUÉ | BLOQUANT | N/A |
| ECT-PLAN-14 | MAINTENU | MINEUR | MINEUR |
| ECT-PLAN-15 | MAINTENU | MAJEUR | MAJEUR |
Bilan : 0 BLOQUANT (vs 4 initiaux), 10 MAJEURS, 2 MINEURS, 3 RÉVOQUÉS
Analyse détaillée¶
ECT-PLAN-01 : S1/S3 en stub¶
Verdict : RÉDUIT
Justification : La spécification §2 mentionne "Prise en charge contractuelle des 3 scénarios de compatibilité secp256k1 (S1, S2, S3)" mais l'hypothèse H-52-07 de la spec précise : "Le custody mode initial pour l'acceptation v1 est S2 (AWS KMS). Simplification de l'intégration ; S1 (HSM) réservé pour production."
Le plan est cohérent avec cette hypothèse explicite. Les stubs S1/S3 permettent de respecter l'interface contractuelle CustodyStrategy (unicité de mode vérifiable) tout en différant l'implémentation complète. Ce n'est pas une violation de la spec mais une priorisation conforme à H-52-07.
Gravité finale : MAJEUR (les stubs doivent retourner CUSTODY_MODE_INVALID, pas échouer silencieusement)
ECT-PLAN-02 : Contradiction /health/bc vs /health/blockchain¶
Verdict : RÉVOQUÉ
Justification : L'auditeur identifie une contradiction entre "/health/bc" (dans le diagramme §2.1) et "/health/blockchain" (dans DA-05).
En réalité, "/health/bc" dans le diagramme est une abréviation visuelle pour tenir dans la boîte du schéma ASCII. La décision DA-05 et le code contract CC-52-14 spécifient explicitement GET /health/blockchain. Il n'y a pas de contradiction contractuelle, seulement une abréviation de présentation.
Gravité finale : N/A (révoqué)
ECT-PLAN-03 : INV-52-11 couverture partielle¶
Verdict : MAINTENU
Justification : L'auditeur a raison. Le mapping INV-52-11 → T-03 couvre uniquement la définition de l'enum des codes d'erreur. Il manque : - Le mécanisme de propagation uniforme (tous les services doivent utiliser BlockchainError) - La politique de journalisation (quels champs sont loggés, lesquels sont exclus)
Ces éléments devraient être explicités dans les code contracts des services (CC-52-04 à CC-52-14).
Gravité finale : MAJEUR
ECT-PLAN-04 : Écart gas non mesuré¶
Verdict : MAINTENU
Justification : Le code contract CC-52-10 (GasEstimatorService) définit estimate() et le plan §6 mentionne "marge +20%", mais il n'y a pas de mécanisme explicite pour : 1. Enregistrer le gas réellement consommé après exécution 2. Calculer l'écart relatif 3. Vérifier CA-52-05 (< 25%)
Le ConfirmationTracker (CC-52-12) devrait inclure la mesure du gas consommé dans TransactionResult.
Gravité finale : MAJEUR
ECT-PLAN-05 : Audit secrets non planifié¶
Verdict : MAINTENU
Justification : Les tâches T-20 à T-23 couvrent les tests unitaires et d'intégration, mais aucune tâche ne planifie explicitement : - Scan gitleaks/trufflehog sur le code - Audit des logs applicatifs - Vérification des variables d'environnement
CA-52-09 requiert un audit multi-couche. Ce devrait être une tâche dédiée (T-24 ?) ou intégrée dans le pipeline CI.
Gravité finale : MAJEUR
ECT-PLAN-06 : Test 10/10 non formalisé¶
Verdict : RÉDUIT
Justification : Le test TC-NOM-01 (spec tests) décrit explicitement : "10 appels consécutifs eth_blockNumber reussis". Le plan mappe CA-52-01/CA-52-02 vers T-22 (tests intégration testnet).
L'écart n'est pas que le test est irréalisable, mais que le plan ne détaille pas explicitement ce scénario. C'est un problème de granularité, pas d'impossibilité.
Gravité finale : MAJEUR (manque de détail, pas bloquant)
ECT-PLAN-07 : SLA failover non mesurable¶
Verdict : RÉDUIT
Justification : Le plan §4 mappe CA-52-07 vers T-05/T-06/T-22 et le code contract CC-52-04 spécifie : - Postcondition : "Temps total de bascule < 5 secondes" - Error_codes : [RPC_PRIMARY_FAILED, RPC_UNAVAILABLE]
Le mécanisme de mesure peut être implicite (horodatage des logs de failover). C'est un manque d'explicitation du point d'observabilité, pas une impossibilité technique.
Le test TC-NOM-09 (spec tests) définit : "Le temps total de bascule est < 5 secondes" comme observable.
Gravité finale : MAJEUR (manque d'explicitation, pas bloquant)
ECT-PLAN-08 : Wallet pré-fundé implicite¶
Verdict : MAINTENU
Justification : L'auditeur a raison. Le plan §7 liste les faucets testnet mais ne formalise pas : - Précondition : wallet fundé avant tests - Procédure de funding automatique ou manuel - Seuil minimum de fonds requis
L'hypothèse H-52-02 de la spec mentionne ce point mais le plan devrait le reprendre explicitement.
Gravité finale : MAJEUR
ECT-PLAN-09 : Infrastructure readiness implicite¶
Verdict : MAINTENU
Justification : Le plan §7 liste les variables d'environnement mais ne formalise pas : - Conditions de readiness KMS (clé créée, permissions IAM) - Conditions de readiness HSM (slot configuré) - Conditions de readiness Vault (moteur Transit activé)
Ces préconditions devraient être documentées dans une section "Prérequis d'environnement".
Gravité finale : MAJEUR
ECT-PLAN-10 : Non-identifiance des métadonnées¶
Verdict : RÉDUIT
Justification : Le plan DA-04 définit une validation whitelist stricte. Le format de transaction type (§3 spec) est : data=keccak256("ProbatioVault:anchor:test:" || timestamp_unix)
Ce payload ne contient que : - Un préfixe fixe (non identifiant) - Un timestamp unix (non identifiant individuellement)
Le risque de corrélation existe théoriquement mais est minimal pour un timestamp. L'écart est valide mais mineur.
Gravité finale : MINEUR
ECT-PLAN-11 : 14 vs 15 codes d'erreur¶
Verdict : RÉVOQUÉ
Justification : L'auditeur compte 15 codes dans CC-52-02 mais la spec §6 définit bien 14 codes (ERR-52-01 à ERR-52-14).
En relisant CC-52-02, l'enum contient : 1. RPC_PRIMARY_FAILED 2. RPC_UNAVAILABLE 3. CUSTODY_MODE_MISSING 4. CUSTODY_MODE_INVALID 5. CUSTODY_MODE_AMBIGUOUS 6. CUSTODY_MODE_UNKNOWN 7. SIGNATURE_VERIFICATION_FAILED 8. INSUFFICIENT_FUNDS 9. GAS_PRICE_CEILING_EXCEEDED 10. TRANSACTION_REORG 11. TRANSACTION_ABANDONED (ajout pour ERR-52-08 timeout 60s) 12. SECRET_LEAK_DETECTED 13. RPC_INVALID_ENDPOINT 14. MAINNET_FORBIDDEN 15. PAYLOAD_VALIDATION_FAILED
TRANSACTION_ABANDONED est dérivé de ERR-52-08 : "Si la transaction ne reapparait pas [...] après 60 secondes, elle est marquée TRANSACTION_ABANDONED."
C'est un code distinct de TRANSACTION_REORG, conforme à la spec. L'auditeur a mal compté les codes de la spec.
Gravité finale : N/A (révoqué)
ECT-PLAN-12 : Composants sans code contract¶
Verdict : MAINTENU
Justification : L'auditeur a raison. Les fichiers suivants n'ont pas de code contract dédié : - providers/rpc-health.service.ts - custody/custody.guard.ts - wallet/wallet.validator.ts - validators/chain-id.guard.ts - dto/*.ts - blockchain.module.ts
Ces composants devraient avoir au minimum une interface et des postconditions définies.
Gravité finale : MAJEUR
ECT-PLAN-13 : Seuil confirmations absent de CC-52-01¶
Verdict : RÉVOQUÉ
Justification : L'auditeur affirme que CC-52-01 ne liste pas les seuils de confirmations. C'est incorrect.
L'interface NetworkConfig dans CC-52-01 inclut explicitement :
export interface NetworkConfig {
chainId: number;
rpcPrimary: string;
rpcSecondary: string;
confirmations: number; // Polygon=5, Arbitrum=1
}
Le champ confirmations est présent et commenté avec les valeurs par défaut. INV-52-13 est couvert.
Gravité finale : N/A (révoqué)
ECT-PLAN-14 : MAINNET_FORBIDDEN chevauchement¶
Verdict : MAINTENU
Justification : L'écart est valide. MAINNET_FORBIDDEN apparaît dans : - CC-52-09 (PayloadValidator) : détection de chain ID mainnet dans le contexte de validation - CC-52-03 (chain-ids) : fonctions utilitaires isMainnetChainId()
Le chevauchement est mineur car chain-id.guard utilise les fonctions de chain-ids.ts, et le code d'erreur peut être émis depuis plusieurs points (défense en profondeur).
Gravité finale : MINEUR
ECT-PLAN-15 : Couverture >= 80% non formalisée¶
Verdict : MAINTENU
Justification : L'auditeur a raison. Le plan mentionne "couverture tests >= 80%" dans les métriques de succès (§1) et le code contract CC-52-19 (tests intégration) mentionne les coverage_targets, mais : - Aucune tâche ne formalise la génération du rapport de couverture - Aucun artefact de preuve n'est défini (rapport Jest/Istanbul)
CA-52-12 requiert : "Pipeline CI vert incluant tests unitaires + integration; couverture unitaire >= 80%."
Gravité finale : MAJEUR
Écarts actifs après confrontation¶
MAJEURS (10)¶
| ID | Description |
|---|---|
| ECT-PLAN-01 | S1/S3 en stub doivent retourner CUSTODY_MODE_INVALID explicitement |
| ECT-PLAN-03 | INV-52-11 : mécanisme de propagation d'erreur non explicité |
| ECT-PLAN-04 | CA-52-05 : mesure de l'écart gas non formalisée |
| ECT-PLAN-05 | CA-52-09 : tâche d'audit secrets manquante |
| ECT-PLAN-06 | CA-52-01/02 : détail du test 10/10 manquant |
| ECT-PLAN-07 | CA-52-07 : point d'observabilité SLA non explicité |
| ECT-PLAN-08 | Précondition wallet fundé non formalisée |
| ECT-PLAN-09 | Préconditions infrastructure non formalisées |
| ECT-PLAN-12 | Composants sans code contract |
| ECT-PLAN-15 | Artefact couverture non formalisé |
MINEURS (2)¶
| ID | Description |
|---|---|
| ECT-PLAN-10 | Risque corrélation métadonnées (timestamp) |
| ECT-PLAN-14 | MAINNET_FORBIDDEN chevauchement (acceptable) |
RÉVOQUÉS (3)¶
| ID | Raison |
|---|---|
| ECT-PLAN-02 | /health/bc est une abréviation du diagramme, pas une contradiction |
| ECT-PLAN-11 | TRANSACTION_ABANDONED est un 15ème code dérivé de ERR-52-08 (conforme) |
| ECT-PLAN-13 | NetworkConfig.confirmations est présent dans CC-52-01 |
Recommandation¶
Verdict préliminaire : RESERVE
Le plan est globalement cohérent et couvre les invariants majeurs. Les écarts identifiés sont des manques d'explicitation plutôt que des violations de la spec. Ils peuvent être corrigés en ajoutant :
- Des code contracts pour les composants manquants
- Une section "Préconditions d'environnement"
- Des détails sur les points d'observabilité dans les tâches de test
- Une tâche dédiée à l'audit de secrets
Aucun écart BLOQUANT ne subsiste après confrontation.