Files
khadhroony-solana-project/deltas/0.2.7/pre.001.md
2026-08-22 15:34:03 +02:00

246 lines
7.4 KiB
Markdown

<!-- file: deltas/0.2.7/pre.001.md -->
<!-- version: 1 -->
# 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<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é
```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`.