# Delta `0.2.7-pre.001` — audit WebSocket Solana, threat model, dependencies et sizing ## Base requise Release stable attendue et auditée : ```text v0.2.6 workspace.package.version = 0.2.6 avant ouverture ``` L'archive Gitea fournie contient `deltas/0.2.6/rel.001.md` et annonce `0.2.7 — WebSocket Solana standard` comme prochaine release. Elle est utilisée comme autorité primaire. ## Type de livraison ```text ksp-general-0.2.7-pre.001.zip ``` L'archive d'échange est un delta applicable depuis la racine de `v0.2.6` et contient uniquement les fichiers ajoutés/modifiés par cette tranche. ## Objet `pre.001` reste volontairement un gate de lecture/audit/conception. Aucun client WebSocket, session runtime, wrapper subscribe ou dependency réseau nouvelle n'est encore ajouté. Le gate : - relit les règles, architecture, plans, validations et contrats réels requis ; - vérifie la stabilité `v0.2.6` et l'héritage HTTP/Wallet Desk ; - réaudite `ksp-onchain-transport-lib` et l'adapter Config actuel ; - constate que `std.transport` V1 est strictement HTTP et décide un V2 explicite HTTP+WS avec backward V1 ; - audite l'archive bot3 comme référence historique seulement ; - réaudite la documentation Solana WebSocket officielle du 2026-08-22 et cross-checke Agave `v3.1.8` sur les ambiguïtés ; - documente notamment `accountSubscribe.minContextSlot` comme option partagée mais ignorée en PubSub, et `vote.timestamp` comme `Option` ; - compte exactement **18 méthodes = 9 subscribe + 9 unsubscribe** ; - classe `block`, `slotsUpdates` et `vote` comme paires unstable ; - crée la matrice compliance initiale `010` ; - audite les crates candidates et retient `tokio-tungstenite 0.30.0` + `futures-util 0.3.34` pour une tranche ultérieure ; - fixe le modèle actor/session, IDs locaux, state machines, reconnect/resubscribe, continuity gaps, backpressure et shutdown ; - fixe les exigences de redaction URL/credentials et de bornes de ressources ; - regranularise la release jusqu'à un forecast nominal `pre.014` sans imposer ce numéro comme deadline. ## Décisions principales ### Cardinalité ```text endpoint -> N sessions physiques explicites -> N subscriptions par session aucun pool/scheduler automatique en 0.2.7 ``` ### Identités ```text WsSessionId stable local KSP WsSubscriptionId stable local KSP remote id éphémère et interne, remappé après reconnect ``` ### Reconnect / resubscribe ```text budget fini backoff exponentiel borné pas de jitter en 0.2.7 policy Never | ActiveSubscriptions ordre de restore déterministe par ID local continuity gap explicite après toute reconnexion aucune garantie lossless / aucun backfill HTTP Transport ``` ### Backpressure ```text command queue bounded notification queue bounded par subscription overflow -> subscription Failed explicite + best-effort unsubscribe aucun drop silencieux les autres subscriptions restent actives ``` ### Config ```text std.transport V1 reste strict et lisible std.transport V2 = HTTP existant + ws_defaults + profiles[].ws_endpoints Config -> Transport uniquement ``` ### Dependencies ```text tokio-tungstenite ^0.30, default-features=false, connect + rustls-tls-webpki-roots futures-util ^0.3, default-features=false, std + sink ``` Ces dependencies sont **planifiées seulement** ; le graphe n'est pas modifié dans `pre.001`. ## Prévision souple recalibrée ```text pre.001 audit + matrice + threat model + dependencies + sizing pre.002 settings/IDs/states/snapshots/redaction pre.003 std.transport V2 + adapter Config pre.004 actor session physique + deps WS + local server pre.005 limits/control/cancellation/shutdown pre.006 registry + generic subscribe/unsubscribe + channels typed pre.007 reconnect/resubscribe/gap/races pre.008 backpressure/limits/leaks adversarial pre.009 account/program/logs pre.010 signature/slot/root pre.011 block/slotsUpdates/vote unstable pre.012 compliance 18/18 + Config composition + HTTP regression pre.013 smoke live + README/USAGE + cargo trees pre.014 workspace final + docs/compliance + prompt 0.2.8 rel.001 publication stable ``` Le sizing reste positif : la release n'est pas scindée fonctionnellement, mais le forecast initial `pre.008` est volontairement décompressé. ## Fichiers ajoutés ```text docs/plans/014-V0_2_7_ONCHAIN_WEBSOCKET_PLAN.md docs/validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md deltas/0.2.7/pre.001.md ``` ## Fichiers modifiés ```text Cargo.toml docs/000-README.md docs/plans/000-README.md docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md docs/validation/000-README.md ``` ## Fichiers volontairement inchangés ```text CHANGELOG.md ROADMAP.md .env.example config/** crates/** docs/architecture/** crates/ksp-onchain-transport-lib/README.md crates/ksp-onchain-transport-lib/USAGE.md ``` `ROADMAP.md` reste global et possède déjà l'entrée `0.2.7`. README/USAGE Transport ne sont pas modifiés avant qu'une surface runtime WebSocket existe réellement. ## Version technique Conformément au workflow non-fix : ```text workspace.package.version = 0.2.7-pre.1 commit = v0.2.7-pre.001 aucun tag prerelease ``` ## Audit officiel WebSocket Index : ```text https://solana.com/docs/rpc/websocket ``` Inventaire exact au 2026-08-22 : ```text accountSubscribe/accountUnsubscribe blockSubscribe/blockUnsubscribe unstable pair logsSubscribe/logsUnsubscribe programSubscribe/programUnsubscribe rootSubscribe/rootUnsubscribe signatureSubscribe/signatureUnsubscribe slotSubscribe/slotUnsubscribe slotsUpdatesSubscribe/slotsUpdatesUnsubscribe unstable pair voteSubscribe/voteUnsubscribe unstable pair ``` Aucune méthode de cet index n'est marquée Deprecated. ## Audit bot3 Référence inspectée : ```text ks-onchain-transport/src/standard_ws.rs ks-onchain-transport/src/ws_client.rs ks-onchain-transport/src/ws_pool.rs ks-onchain-transport/src/ws_session.rs ``` Repris comme concepts : session multiplexée, ID local/remote séparé, reconnect/resubscribe borné. Rejetés : Transport -> Config, tracing direct, scheduler/pool, unsubscribe public par remote ID et broadcast data comme contrat principal. ## Validations exécutées avant modification ```text archive stable v0.2.6 extraite/auditée OK documents internes obligatoires relus OK inventory Transport + Config OK archive bot3 auditée OK documentation Solana WebSocket actuelle auditée OK dependencies Rust candidates auditée OK python3 scripts/audit_rust_workspace_rules.py OK ``` Sortie audit Python : ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean ``` ## Validations tentées mais impossibles dans le sandbox Le binaire `cargo` n'est pas installé. Tentatives avant modification : ```text cargo fmt --all code 127 cargo check --workspace code 127 cargo clippy --workspace --all-targets code 127 ``` Aucune de ces commandes n'est déclarée réussie. ## Validation opérateur requise avant commit ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py cargo check --workspace cargo clippy --workspace --all-targets ``` Aucun test Transport, Config, workspace ou smoke live n'est déclaré vert dans ce sandbox tant qu'il n'a pas été effectivement exécuté par l'opérateur. Aucun build Tauri n'est requis pour `0.2.7-pre.001`.