Files
2026-08-22 15:34:03 +02:00

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.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<i64> ;
  • 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é

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.