# Delta `0.2.8-pre.008` — adversarial Helius provider + limites + diagnostics sûrs ## 1. Base et objet Base appliquée : ```text 0.2.8-pre.7.fix.4 ``` Le checkpoint opérateur final de `pre.007` est intégralement vert : ```text cargo fmt --all OK python3 scripts/audit_rust_workspace_rules.py clean cargo check --workspace OK cargo clippy --workspace --all-targets OK Transport unit 331/331 Transport public API 40/40 Transport release completeness 29/29 Transport doctests compile-fail 4/4 cargo test --workspace OK ``` `pre.008` durcit la surface Helius WebSocket contre des comportements provider adversariaux sans créer de nouveau runtime. La tranche réutilise l'actor physique, les limites frame/message, le reconnect, le registry et la backpressure existants. ## 2. Version technique ```text workspace.package.version = 0.2.8-pre.8 commit attendu = v0.2.8-pre.008 Git tag = aucun tag prerelease ``` Le header root `Cargo.toml` passe en version `232`. ## 3. Ré-audit Helius courant La documentation Helius réauditée le 2026-08-23 confirme : ```text transactionSubscribe supporté transactionUnsubscribe supporté accountInclude/accountExclude/accountRequired 50 000 adresses max par liste blockSubscribe non supporté Helius slotsUpdatesSubscribe non supporté Helius voteSubscribe non supporté Helius endpoints WSS unifiés mainnet/devnet ``` La tranche n'introduit donc aucune nouvelle famille provider. ## 4. `Debug` sûr pour les notifications Helius Le prompt `0.2.8` interdit les payloads arbitraires/massifs dans les diagnostics génériques. Avant cette tranche, les types de notification Helius dérivaient `Debug`, ce qui pouvait rendre : ```text transaction JSON brut signature complète memo/error provider fallback Unknown(serde_json::Value) brut ``` `pre.008` remplace ces dérivations par des implémentations explicites : ```text HeliusFullTransactionNotification transaction signature slot visible transaction_index visible HeliusTransactionSignatureNotification signature slot/index visibles err omitted/null/value seulement memo omitted/null/value seulement block_time omitted/null/value seulement confirmation_status omitted/null/value seulement HeliusTransactionNotification::Unknown payload Value conservé fonctionnellement Debug = Unknown("") ``` Aucun accessor fonctionnel n'est supprimé. La donnée reste accessible explicitement au consommateur qui la demande ; seul le chemin diagnostic implicite est redacted. ## 5. Capability guard inverse La façade Helius avait déjà quatre doctests compile-fail : ```text Helius -X-> blockSubscribe Helius -X-> slotsUpdatesSubscribe Helius -X-> voteSubscribe Helius -X-> into_inner ``` `pre.008` ajoute le canari inverse : ```text SolanaStandardWsSession -X-> transactionSubscribe ``` La séparation standard/provider est donc prouvée dans les deux sens sans exposer le `WsSession` générique. ## 6. Provider RPC application error Un serveur local adversarial retourne une erreur JSON-RPC `transactionSubscribe` avec : ```text code provider message canary sensible payload data arbitraire de plusieurs KiB ``` Le canari exige : ```text ERROR_CODE_RPC_APPLICATION_ERROR context sûr = rpc_code + method message/data provider non copiés dans KspError api-key URL non rendue filter signature non rendue session physique reste Active subscription_count revient à 0 rootSubscribe fonctionne ensuite normalement ``` Une erreur d'application provider ne doit donc pas être promue en panne de transport. ## 7. Notification method mismatch Un remote ID enregistré comme `HeliusTransaction` reçoit volontairement un `rootNotification`. Résultat attendu : ```text logical transaction subscription -> Failed / WS_PROTOCOL_ERROR remote binding transaction -> cleanup transactionUnsubscribe session physique -> Active subscription root saine -> Active et notification reçue ``` Le mismatch de famille ne doit pas contaminer les autres logical subscriptions. ## 8. Payload entrant oversized Un endpoint Helius local envoie une frame texte supérieure aux limites configurées : ```text max_message_size_bytes = 256 max_frame_size_bytes = 128 ``` Le canari prouve que la limite tungstenite/actor s'applique avant tout décodage JSON provider, déclenche le reconnect borné existant et laisse la connexion Helius de remplacement utilisable pour un `rootSubscribe`/unsubscribe normal. Aucun nouveau compteur ou chemin de reconnect n'est ajouté. ## 9. Backpressure et lifecycle conservés La preuve provider-specific de `pre.006` reste autoritaire pour : ```text queue capacity = 1 transaction notification overflow échec de la seule transaction subscription cleanup transactionUnsubscribe root subscription saine non affectée session physique Active ``` `pre.008` ne duplique pas ce scénario. Les canaris partagés hérités continuent aussi de couvrir unsubscribe pendant reconnect, decode failure isolé, pending bounds et shutdown pendant backoff. ## 10. Canaris ajoutés Quatre unit tests Helius sont ajoutés : ```text notification Debug redaction Full/Signature/Unknown provider RPC application error sûre + session réutilisable notification method mismatch isolé + cleanup transactionUnsubscribe oversized inbound provider payload + reconnect + session réutilisable ``` Un release-completeness canary supplémentaire vérifie les guards, les `Debug` explicites et la réutilisation des mécanismes de bornage de l'actor. Un doctest compile-fail supplémentaire interdit `transactionSubscribe` sur `SolanaStandardWsSession`. Comptages attendus : ```text Transport unit 335 Transport public API 40 release completeness 30 doctests compile-fail 5 ``` ## 11. Fichiers modifiés ```text Cargo.toml crates/ksp-onchain-transport-lib/src/ws_helius_transactions.rs crates/ksp-onchain-transport-lib/src/ws_protocol_session.rs crates/ksp-onchain-transport-lib/unit_tests/ws_helius_transactions.rs crates/ksp-onchain-transport-lib/tests/release_completeness.rs docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md docs/validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md deltas/0.2.8/pre.008.md ``` ## 12. Hors scope Restent hors de `pre.008` : ```text compliance finale Helius + standard/HTTP pre.009 smoke Helius live + cargo tree final pre.010 fermeture docs/indexes + prompt 0.2.9 pre.011 LaserStream gRPC futur backend séparé Gatekeeper/preconf WebSocket hors scope 0.2.8 ``` ## 13. Gate opérateur ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-onchain-transport-lib cargo test --workspace ``` Critère de fermeture : zéro warning, audit clean, **335 unit / 40 public API / 30 completeness / 5 doctests** et workspace vert.