7.4 KiB
Delta 0.2.7-pre.001 — audit WebSocket Solana, threat model, dependencies et sizing
Base requise
Release stable attendue et auditée :
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
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.6et l'héritage HTTP/Wallet Desk ; - réaudite
ksp-onchain-transport-libet l'adapter Config actuel ; - constate que
std.transportV1 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.8sur les ambiguïtés ; - documente notamment
accountSubscribe.minContextSlotcomme option partagée mais ignorée en PubSub, etvote.timestampcommeOption<i64>; - compte exactement 18 méthodes = 9 subscribe + 9 unsubscribe ;
- classe
block,slotsUpdatesetvotecomme paires unstable ; - crée la matrice compliance initiale
010; - audite les crates candidates et retient
tokio-tungstenite 0.30.0+futures-util 0.3.34pour 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.014sans imposer ce numéro comme deadline.
Décisions principales
Cardinalité
endpoint -> N sessions physiques explicites -> N subscriptions par session
aucun pool/scheduler automatique en 0.2.7
Identités
WsSessionId stable local KSP
WsSubscriptionId stable local KSP
remote id éphémère et interne, remappé après reconnect
Reconnect / resubscribe
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
command queue bounded
notification queue bounded par subscription
overflow -> subscription Failed explicite + best-effort unsubscribe
aucun drop silencieux
les autres subscriptions restent actives
Config
std.transport V1 reste strict et lisible
std.transport V2 = HTTP existant + ws_defaults + profiles[].ws_endpoints
Config -> Transport uniquement
Dependencies
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
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
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
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
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 :
workspace.package.version = 0.2.7-pre.1
commit = v0.2.7-pre.001
aucun tag prerelease
Audit officiel WebSocket
Index :
https://solana.com/docs/rpc/websocket
Inventaire exact au 2026-08-22 :
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 :
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
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 :
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 :
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
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.