v0.2.8-pre.010
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# file: Cargo.toml
|
||||
# version: 233
|
||||
# version: 234
|
||||
|
||||
[workspace]
|
||||
resolver = "3"
|
||||
members = ["crates/ksp-app-config-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-wallet-lib"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.2.8-pre.9"
|
||||
version = "0.2.8-pre.10"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-onchain-transport-lib/README.md -->
|
||||
<!-- version: 19 -->
|
||||
<!-- version: 20 -->
|
||||
|
||||
# `ksp-onchain-transport-lib`
|
||||
|
||||
@@ -199,6 +199,24 @@ Ces familles restent explicitement **unstable**. Le moteur commun `subscribe_typ
|
||||
|
||||
`SolanaVoteNotification` conserve `votePubkey`, `slots`, `hash`, `timestamp` et `signature`. Le timestamp reste optionnel : omission et `null` deviennent `None`, tandis qu'une valeur `i64` est préservée. Transport ne transforme pas ces votes gossip pre-consensus en vérité ledger.
|
||||
|
||||
## Helius LaserStream WebSocket
|
||||
|
||||
La façade `HeliusLaserStreamWsSession` utilise le même actor physique `WsSession` mais expose uniquement la surface provider actuellement retenue par l’audit Helius :
|
||||
|
||||
```text
|
||||
standard réutilisé : account / logs / program / root / signature / slot / slotsUpdates
|
||||
extension Helius : transactionSubscribe / transactionUnsubscribe
|
||||
absent Helius : block / vote
|
||||
```
|
||||
|
||||
`slotsUpdates` reste **unstable** et conserve le warning centralisé du moteur standard. `block` et `vote` restent absents de la façade Helius même s’ils existent sur la façade Solana standard. `transactionSubscribe` reste provider-specific et n’est jamais ajouté à `SolanaStandardWsSession`.
|
||||
|
||||
Les endpoints Helius mainnet/devnet utilisent un `api-key` dans l’URL. KSP recommande de les construire via `ksp-config-lib` et `KSP_SECRET_HELIUS_API_KEY`; la valeur réelle atteint Transport mais les projections sûres, `Debug`, snapshots, erreurs et diagnostics n’exposent pas le credential. Transport ne lit jamais l’environnement et ne dépend jamais de Config.
|
||||
|
||||
Pour Helius, l’actor envoie automatiquement un control frame WebSocket `Ping` toutes les 60 secondes sur une session active. Cette policy est provider-owned, non configurable et ne s’applique pas aux sessions `SolanaStandard`. Une perte physique suit le reconnect/resubscribe borné déjà décrit; aucun replay/lossless n’est promis par la couche WebSocket.
|
||||
|
||||
LaserStream **gRPC** reste un backend distinct, hors de cette façade, de `WsProtocolKind` et de la Config WebSocket `helius_laserstream`.
|
||||
|
||||
## Résilience
|
||||
|
||||
L'admission est calculée par couple endpoint/rôle. Le pool applique :
|
||||
@@ -260,6 +278,8 @@ Le smoke WebSocket Transport cible uniquement la famille stable `slotSubscribe`
|
||||
|
||||
Les trois tests sont `ignored` par défaut. Les deux smokes Transport appartiennent durablement à cette crate ; le smoke cross-crates hébergé dans Config reste transitoire jusqu'à l'existence d'une surface KSP d'intégration/orchestration appropriée. Un rate-limit, refus externe ou incident Devnet n'est pas assimilé automatiquement à une régression locale.
|
||||
|
||||
Aucun smoke Helius live supplémentaire n’est committé en `0.2.8-pre.010`. Un tel test devrait à la fois obtenir `KSP_SECRET_HELIUS_API_KEY` via Config et exercer Transport ; l’ajouter dans Transport violerait l’ownership environnement/secret, tandis que l’ajouter dans Config étendrait l’exception cross-crates que le projet veut au contraire résorber. La première surface KSP d’intégration/orchestration dédiée devra héberger ce smoke. Le scénario live recommandé est alors `helius_devnet -> HeliusLaserStreamWsSession -> slotSubscribe -> notification -> unsubscribe -> close`; `transactionSubscribe` reste un smoke optionnel dépendant des droits provider et ne devient pas un gate stable de release.
|
||||
|
||||
## Documentation
|
||||
|
||||
- [`USAGE.md`](USAGE.md) — consommation directe, Config -> Transport, API typed/raw, smokes et inspection runtime ;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: crates/ksp-onchain-transport-lib/USAGE.md -->
|
||||
<!-- version: 19 -->
|
||||
<!-- version: 20 -->
|
||||
|
||||
# Utilisation de `ksp-onchain-transport-lib`
|
||||
|
||||
@@ -183,6 +183,46 @@ let mut blocks = match session
|
||||
|
||||
Les trois familles utilisent le même `WsSubscription::unsubscribe().await`; aucun remote subscription ID n'entre dans l'API publique.
|
||||
|
||||
### Façade Helius LaserStream WebSocket
|
||||
|
||||
Pour un endpoint Config `kind = "helius_laserstream"`, le consumer doit sélectionner l’endpoint WebSocket résolu puis ouvrir la façade Helius, sans reconstruire ni journaliser l’URL contenant l’API key :
|
||||
|
||||
```rust
|
||||
let resolved = match engine.load_resolved_transport_config(Some("helius_devnet"), &environment) {
|
||||
Ok(value) => value,
|
||||
Err(error) => return Err(error),
|
||||
};
|
||||
let ws_settings = match resolved.ws_settings() {
|
||||
Some(value) => value,
|
||||
None => return Err(ksp_core_lib::Error::new(ksp_onchain_transport_lib::ERROR_CODE_INVALID_SETTINGS, "Helius profile requires WebSocket settings")),
|
||||
};
|
||||
let endpoint = match ws_settings
|
||||
.endpoints()
|
||||
.iter()
|
||||
.find(|candidate| candidate.enabled() && candidate.protocol() == ksp_onchain_transport_lib::WsProtocolKind::HeliusLaserStream)
|
||||
{
|
||||
Some(value) => value.clone(),
|
||||
None => return Err(ksp_core_lib::Error::new(ksp_onchain_transport_lib::ERROR_CODE_INVALID_SETTINGS, "Helius WebSocket endpoint is unavailable")),
|
||||
};
|
||||
let session = match ksp_onchain_transport_lib::HeliusLaserStreamWsSession::connect(endpoint).await {
|
||||
Ok(value) => value,
|
||||
Err(error) => return Err(error),
|
||||
};
|
||||
let mut slots = match session.slot_subscribe().await {
|
||||
Ok(value) => value,
|
||||
Err(error) => return Err(error),
|
||||
};
|
||||
let notification = slots.recv().await;
|
||||
let removed = slots.unsubscribe().await;
|
||||
let closed = session.close().await;
|
||||
```
|
||||
|
||||
La façade Helius réutilise `account`, `logs`, `program`, `root`, `signature`, `slot` et `slotsUpdates`. `slotsUpdates` reste unstable. `block` et `vote` ne sont pas exposés. `transaction_subscribe()` prend `HeliusTransactionSubscribeRequest` et retourne `WsSubscription<HeliusTransactionNotification>` ; son unsubscribe reste porté par le handle et produit `transactionUnsubscribe` sans exposer l’ID distant.
|
||||
|
||||
Le heartbeat Helius est automatique : `WsSession` envoie un control frame `Ping` toutes les 60 secondes tant que la session Helius est active. Le consumer ne configure pas un second timer et ne lance pas un task heartbeat parallèle. Cette règle ne vaut pas pour `SolanaStandardWsSession`.
|
||||
|
||||
`KSP_SECRET_HELIUS_API_KEY` appartient à Config. Ne pas lire l’environnement dans Transport, ne pas recopier l’URL résolue dans un log et ne pas ajouter un dev-dependency inverse `Transport -> Config`. LaserStream gRPC reste un backend différent et ne doit pas réutiliser `WsProtocolKind::HeliusLaserStream`.
|
||||
|
||||
### Reconnect automatique borné
|
||||
|
||||
Les settings de session contrôlent le reconnect physique. Une perte de socket publie `Reconnecting { attempt }`, invalide les remote IDs et incrémente `continuity_gap_count`. Avec la policy par défaut `ActiveSubscriptions`, les handles logiques gardent leur `WsSubscriptionId` et passent temporairement en `Resubscribing`; l'actor recrée leurs subscriptions dans l'ordre local avant de republier `Active`.
|
||||
@@ -358,7 +398,25 @@ cargo test -p ksp-config-lib --test transport_devnet_smoke -- --ignored --nocapt
|
||||
|
||||
Il valide le profil committé `devnet_public` et les quatre canaris foundation. Il reste transitoirement hébergé dans Config : les futurs smokes cross-crates ne doivent pas faire de Config leur destination générale et devront migrer vers une surface d'intégration/orchestration dédiée lorsqu'elle existera.
|
||||
|
||||
Les endpoints publics Solana sont rate-limités et non destinés à la production. Un échec réseau externe n'est pas assimilé automatiquement à une régression locale ; les fixtures HTTP et WebSocket locales restent les gates reproductibles.
|
||||
### Smoke Helius live
|
||||
|
||||
Aucun nouveau test Helius live n’est committé en `0.2.8-pre.010`. La raison est architecturale : Transport ne peut pas lire `KSP_SECRET_HELIUS_API_KEY` ni dépendre de Config, et Config ne doit pas devenir la destination générale des futurs smokes `Config + autre crate`. Créer un quatrième smoke dans l’une de ces deux crates contournerait donc une frontière déjà documentée.
|
||||
|
||||
Lorsque la surface KSP d’intégration/orchestration dédiée existera, le smoke live minimal recommandé sera :
|
||||
|
||||
```text
|
||||
Config helius_devnet
|
||||
-> endpoint helius_laserstream résolu avec KSP_SECRET_HELIUS_API_KEY
|
||||
-> HeliusLaserStreamWsSession::connect
|
||||
-> slotSubscribe
|
||||
-> une slotNotification sous timeout
|
||||
-> slotUnsubscribe
|
||||
-> close
|
||||
```
|
||||
|
||||
Ce scénario utilise une méthode standard stable sur l’endpoint Helius et teste donc auth + façade provider + actor + unsubscribe sans dépendre d’une entitlement particulière de `transactionSubscribe`. Un smoke `transactionSubscribe` pourra être ajouté séparément comme opt-in provider-specific si l’environnement opérateur possède les droits nécessaires ; il ne doit pas devenir un gate réseau obligatoire de la release.
|
||||
|
||||
Les endpoints publics/provider sont des dépendances externes. Un rate-limit, refus d’auth, entitlement absente ou incident réseau n’est pas assimilé automatiquement à une régression locale ; les fixtures HTTP/WebSocket locales et les gates déterministes restent autoritaires.
|
||||
|
||||
Pour auditer les dépendances, inspecter également le graphe effectif après résolution Cargo :
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-onchain-transport-lib/tests/release_completeness.rs
|
||||
// version: 31
|
||||
// version: 32
|
||||
|
||||
//! Release-level completeness canaries for staged HTTP and WebSocket Transport coverage.
|
||||
|
||||
@@ -974,3 +974,25 @@ fn release_v0_2_8_pre_009_config_secret_and_dependency_boundaries_remain_wired()
|
||||
let env_example = std::fs::read_to_string(workspace.join(".env.example")).expect(".env.example must be readable");
|
||||
assert!(env_example.contains("KSP_SECRET_HELIUS_API_KEY"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn release_v0_2_8_pre_010_live_smoke_policy_preserves_secret_and_dependency_ownership() {
|
||||
let manifest_directory = std::path::Path::new(env!("CARGO_MANIFEST_DIR"));
|
||||
let workspace = manifest_directory.parent().and_then(std::path::Path::parent).expect("Transport integration test must resolve the workspace root");
|
||||
let transport_manifest = std::fs::read_to_string(manifest_directory.join("Cargo.toml")).expect("Transport manifest must be readable");
|
||||
assert!(!transport_manifest.contains("ksp-config-lib"));
|
||||
let transport_ws_smoke =
|
||||
std::fs::read_to_string(manifest_directory.join("tests/websocket_devnet_smoke.rs")).expect("Transport WebSocket smoke must be readable");
|
||||
assert!(!transport_ws_smoke.contains("KSP_SECRET_HELIUS_API_KEY"));
|
||||
assert!(!transport_ws_smoke.contains("ConfigEnvironment"));
|
||||
assert!(!workspace.join("crates/ksp-config-lib/tests/helius_websocket_smoke.rs").exists());
|
||||
let readme = std::fs::read_to_string(manifest_directory.join("README.md")).expect("Transport README must be readable");
|
||||
assert!(readme.contains("Aucun smoke Helius live supplémentaire n’est committé en `0.2.8-pre.010`"));
|
||||
assert!(readme.contains("KSP_SECRET_HELIUS_API_KEY"));
|
||||
let usage = std::fs::read_to_string(manifest_directory.join("USAGE.md")).expect("Transport USAGE must be readable");
|
||||
assert!(usage.contains("### Smoke Helius live"));
|
||||
assert!(usage.contains("surface KSP d’intégration/orchestration dédiée"));
|
||||
assert!(usage.contains("cargo tree -p ksp-onchain-transport-lib"));
|
||||
let env_example = std::fs::read_to_string(workspace.join(".env.example")).expect(".env.example must be readable");
|
||||
assert!(env_example.contains("KSP_SECRET_HELIUS_API_KEY"));
|
||||
}
|
||||
|
||||
73
deltas/0.2.8/pre.010.md
Normal file
73
deltas/0.2.8/pre.010.md
Normal file
@@ -0,0 +1,73 @@
|
||||
<!-- file: deltas/0.2.8/pre.010.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.2.8-pre.010` — documentation Helius finale + stratégie smoke live + cargo tree final
|
||||
|
||||
## Objet
|
||||
|
||||
Fermer la documentation d’usage de la surface Helius WebSocket acquise en `pre.009`, décider explicitement si un smoke Helius live peut être committé sans violer les frontières KSP, puis demander le dernier audit du graphe Cargo avant la tranche de clôture.
|
||||
|
||||
## Décision smoke live
|
||||
|
||||
Aucun nouveau smoke Helius live n’est ajouté dans cette tranche.
|
||||
|
||||
Motif :
|
||||
|
||||
```text
|
||||
Transport ne peut ni lire KSP_SECRET_HELIUS_API_KEY ni dépendre de Config.
|
||||
Config ne doit pas devenir la destination générale des futurs smokes Config + autre crate.
|
||||
Le smoke Config -> Transport historique reste une exception transitoire déjà documentée.
|
||||
```
|
||||
|
||||
Le propriétaire durable sera la future surface KSP d’intégration/orchestration. Son scénario minimal devra utiliser `helius_devnet`, ouvrir `HeliusLaserStreamWsSession`, faire `slotSubscribe`, attendre une notification sous timeout, unsubscribe puis close. `transactionSubscribe` pourra rester un opt-in additionnel soumis aux droits provider.
|
||||
|
||||
## Documentation
|
||||
|
||||
`README.md` et `USAGE.md` de Transport documentent désormais :
|
||||
|
||||
- Helius = `account/logs/program/root/signature/slot/slotsUpdates` + `transaction` ;
|
||||
- `block` et `vote` absents ;
|
||||
- `slotsUpdates` unstable ;
|
||||
- heartbeat Helius control-frame Ping à 60 s ;
|
||||
- secret Helius résolu par Config, jamais lu par Transport ;
|
||||
- LaserStream gRPC distinct du namespace WebSocket ;
|
||||
- stratégie de smoke live et future ownership d’intégration.
|
||||
|
||||
## Canari de release
|
||||
|
||||
Un canari `release_completeness` supplémentaire vérifie que :
|
||||
|
||||
- Transport ne dépend toujours pas de Config ;
|
||||
- le smoke WebSocket Transport ne lit ni `KSP_SECRET_HELIUS_API_KEY` ni `ConfigEnvironment` ;
|
||||
- aucun `helius_websocket_smoke.rs` n’est ajouté à Config ;
|
||||
- README/USAGE portent explicitement la décision et les commandes `cargo tree` ;
|
||||
- `.env.example` conserve l’inventaire `KSP_SECRET_HELIUS_API_KEY`.
|
||||
|
||||
## Version et comptages attendus
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.2.8-pre.10
|
||||
commit attendu = v0.2.8-pre.010
|
||||
Git tag = aucun
|
||||
|
||||
Transport unit 335
|
||||
Transport public API 41
|
||||
release completeness 34
|
||||
Transport doctests 4
|
||||
```
|
||||
|
||||
## Audit opérateur requis
|
||||
|
||||
```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
|
||||
cargo tree -p ksp-onchain-transport-lib
|
||||
cargo tree -p ksp-onchain-transport-lib --duplicates
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
`pre.011` ne s’ouvre qu’après gate vert et inspection des graphes résolus.
|
||||
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md -->
|
||||
<!-- version: 23 -->
|
||||
<!-- version: 24 -->
|
||||
|
||||
# Plan `0.2.8` — Helius LaserStream WebSocket
|
||||
|
||||
> **Statut : `0.2.8-pre.008` est validé intégralement par l’opérateur : fmt/audit/check/Clippy, 335 unit Transport, 40 API, 30 completeness, 5 doctests et workspace complet verts. `0.2.8-pre.009` réconcilie la documentation Helius courante, ajoute `slotsUpdates` à la façade Helius et ferme les canaris de compliance HTTP/WS/Config/dependencies.**
|
||||
> **Statut : `0.2.8-pre.009` est validé intégralement par l’opérateur : fmt/audit/check/Clippy, 335 unit Transport, 41 API, 33 completeness, 4 doctests et workspace complet verts. `0.2.8-pre.010` synchronise README/USAGE, ferme la stratégie de smoke live sans violer l’ownership Config/Transport et demande le cargo tree final à l’opérateur.**
|
||||
|
||||
## 1. Objet, base et état courant
|
||||
|
||||
@@ -39,10 +39,12 @@ pre.007-fix.001 lint + close canary corrigés
|
||||
pre.007-fix.002 observation yield-only insuffisante — checkpoint historique
|
||||
pre.007-fix.003 heartbeat Transport fermé
|
||||
pre.007-fix.004 alignement canari dependency-firewall Tokio dev validé
|
||||
pre.008 adversarial provider/capabilities/payload/security — préparé
|
||||
pre.008 adversarial provider/capabilities/payload/security validé
|
||||
pre.009 compliance provider/current + slotsUpdates Helius validé
|
||||
pre.010 documentation/smoke policy/cargo tree final — préparé
|
||||
|
||||
workspace.package.version courant = 0.2.8-pre.8
|
||||
commit attendu = v0.2.8-pre.008
|
||||
workspace.package.version courant = 0.2.8-pre.10
|
||||
commit attendu = v0.2.8-pre.010
|
||||
aucun tag prerelease
|
||||
```
|
||||
|
||||
@@ -78,10 +80,10 @@ pre.007 DONE — heartbeat Helius WebSocket/idle + timers + interaction reconne
|
||||
fix.003 DONE — canari heartbeat périodique stabilisé sans changer le runtime
|
||||
fix.004 DONE — dependency-firewall aligné sur `io-util, net, rt, test-util`
|
||||
pre.008 DONE — provider adversarial lifecycle + capability guards + payload/backpressure + security/redaction
|
||||
pre.009 PREPARED — compliance Helius WebSocket + réconciliation documentaire `slotsUpdates`
|
||||
pre.009 DONE — compliance Helius WebSocket + réconciliation documentaire `slotsUpdates`
|
||||
+ non-régressions Solana standard 18/18 + HTTP 52/14 + Config/API/dependency-firewall canaries
|
||||
pre.010 smoke Helius WebSocket live opt-in si stratégie sûre + README/USAGE
|
||||
+ cargo tree direct/duplicates final
|
||||
pre.010 PREPARED — stratégie smoke Helius live fermée sans nouveau cross-crate owner + README/USAGE
|
||||
+ cargo tree direct/duplicates final à rejouer par l’opérateur
|
||||
pre.011 validation workspace finale + fermeture plan/matrice/indexes + prompt 0.2.9
|
||||
rel.001 publication stable stricte
|
||||
```
|
||||
@@ -1461,3 +1463,63 @@ Aucune nouvelle dépendance, aucun nouveau DTO Helius pour `slotsUpdates`, aucun
|
||||
|
||||
`pre.010` reste réservé au smoke Helius live opt-in si une stratégie credential-safe est disponible, à README/USAGE et au `cargo tree` final.
|
||||
|
||||
## 22. Fermeture `pre.009` et préparation `pre.010`
|
||||
|
||||
Checkpoint opérateur `0.2.8-pre.9` reçu le 2026-08-23 :
|
||||
|
||||
```text
|
||||
[x] cargo fmt --all
|
||||
[x] python3 scripts/audit_rust_workspace_rules.py = clean / 0 candidate
|
||||
[x] cargo check --workspace = vert, sans warning
|
||||
[x] cargo clippy --workspace --all-targets = vert, sans warning
|
||||
[x] Transport unit = 335/335
|
||||
[x] Transport public API = 41/41
|
||||
[x] release completeness = 33/33
|
||||
[x] Transport doctests = 4/4
|
||||
[x] cargo test --workspace = vert
|
||||
```
|
||||
|
||||
Verdict : **`pre.009` DONE.**
|
||||
|
||||
Le réaudit Helius courant confirme les endpoints unifiés `wss://mainnet.helius-rpc.com/?api-key=...` et `wss://devnet.helius-rpc.com/?api-key=...`, le heartbeat recommandé par Ping chaque minute, `slotSubscribe` sur ces endpoints et `transactionSubscribe` comme extension Helius. La stratégie de smoke durable est néanmoins contrainte par l’architecture KSP :
|
||||
|
||||
```text
|
||||
Transport -X-> Config / environnement
|
||||
Config ne doit pas devenir la destination générale des futurs smokes cross-crates
|
||||
KSP_SECRET_HELIUS_API_KEY appartient exclusivement à Config
|
||||
```
|
||||
|
||||
Décision `pre.010` : **aucun nouveau smoke Helius live committé dans Transport ou Config**. La future surface KSP d’intégration/orchestration dédiée devra porter le scénario `Config helius_devnet -> HeliusLaserStreamWsSession -> slotSubscribe -> notification -> unsubscribe -> close`. `transactionSubscribe` pourra rester un smoke opt-in supplémentaire dépendant des droits provider, jamais un gate réseau stable.
|
||||
|
||||
Livraison `pre.010` :
|
||||
|
||||
```text
|
||||
- README Transport synchronisé avec la surface Helius finale 7 standard + transaction
|
||||
- USAGE Transport documente Config -> façade Helius, heartbeat et limites d’ownership
|
||||
- release completeness verrouille l’absence de lecture secret/env dans le smoke Transport
|
||||
- aucun nouveau test Helius live dans Config
|
||||
- aucune nouvelle dépendance
|
||||
- cargo tree final requis de l’opérateur
|
||||
```
|
||||
|
||||
Gate attendu :
|
||||
|
||||
```text
|
||||
Transport unit 335
|
||||
Transport public API 41
|
||||
release completeness 34
|
||||
Transport doctests 4
|
||||
workspace vert
|
||||
warnings 0
|
||||
```
|
||||
|
||||
Audit graphe à joindre au checkpoint opérateur :
|
||||
|
||||
```bash
|
||||
cargo tree -p ksp-onchain-transport-lib
|
||||
cargo tree -p ksp-onchain-transport-lib --duplicates
|
||||
cargo tree --duplicates
|
||||
```
|
||||
|
||||
`pre.011` reste bloqué jusqu’au gate complet et à l’inspection de ces graphes.
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md -->
|
||||
<!-- version: 22 -->
|
||||
<!-- version: 23 -->
|
||||
|
||||
# Validation `0.2.8` — Helius LaserStream WebSocket
|
||||
|
||||
> **Statut : `pre.008` est entièrement vert : 335/335 unit Transport, 40/40 API, 30/30 completeness, 5/5 doctests et workspace complet. `pre.009` est préparé avec réconciliation de la documentation Helius courante : `slotsUpdates` rejoint la façade Helius ; `block` et `vote` restent explicitement non supportés.**
|
||||
> **Statut : `pre.009` est entièrement vert : 335/335 unit Transport, 41/41 API, 33/33 completeness, 4/4 doctests et workspace complet. `pre.010` est préparé pour synchroniser README/USAGE, verrouiller la stratégie de smoke live architecture-safe et rejouer le cargo tree final.**
|
||||
|
||||
## 1. Références
|
||||
|
||||
@@ -31,6 +31,7 @@ pre.007 paused-I/O observation fix deltas/0.2.8/pre.007-fix.003.md
|
||||
pre.007 dependency-firewall fix deltas/0.2.8/pre.007-fix.004.md
|
||||
pre.008 adversarial/compliance guard deltas/0.2.8/pre.008.md
|
||||
pre.009 compliance provider/current deltas/0.2.8/pre.009.md
|
||||
pre.010 docs/smoke/tree final deltas/0.2.8/pre.010.md
|
||||
validation standard WS docs/validation/010-V0_2_7_ONCHAIN_WEBSOCKET.md
|
||||
HTTP compliance docs/validation/007-V0_2_4_HTTP_FINAL_COMPLIANCE.md
|
||||
KSP-TRANSPORT-007 docs/validation/005-V0_2_3_KSP_TRANSPORT_007_RETRO_AUDIT.md
|
||||
@@ -105,25 +106,25 @@ Verdict : **gate `0.2.8-pre.001` positif ; `pre.002` + `fix.001` et `pre.003` so
|
||||
|
||||
## 3. Matrice provider normative
|
||||
|
||||
| Capability | Standard KSP | Helius doc actuelle | Décision `0.2.8` | Surface Helius attendue | Preuve finale attendue |
|
||||
|------------------------------|----------------:|---------------------------------------------------|--------------------------|-------------------------|---------------------------------------|
|
||||
| `accountSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `logsSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `programSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `rootSubscribe` pair | oui | supporté | réutiliser standard | présente | exact wire + no regression |
|
||||
| `signatureSubscribe` pair | oui | supporté | réutiliser standard | présente | one-shot conservé |
|
||||
| `slotSubscribe` pair | oui | supporté | réutiliser standard | présente | exact wire + no regression |
|
||||
| `blockSubscribe` pair | oui, unstable | non supporté | ne pas exposer Helius | **absente** | API absence + guard interne avant I/O |
|
||||
| `slotsUpdatesSubscribe` pair | oui, unstable | page spécifique + overview courant = disponible | réutiliser wire standard | présente | exact wire + warning unstable |
|
||||
| `voteSubscribe` pair | oui, unstable | non supporté | ne pas exposer Helius | **absente** | API absence + guard interne avant I/O |
|
||||
| `transactionSubscribe` | non standard | extension Helius | ajouter typed | présente | request/ack/notification fixtures |
|
||||
| `transactionUnsubscribe` | non standard | documenté dans référence transaction | ajouter via handle | présente | exact method + late-message race |
|
||||
| `tokenAccounts` | non standard | `none/balanceChanged/all` | ajouter typed | présente dans filter | enum + serialization |
|
||||
| `notifyOn` account | non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
|
||||
| `notifyOn` program | non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
|
||||
| enhanced account extra | non standard | mentionné, wire exact non publié | report explicite | absente | réaudit final |
|
||||
| proactive heartbeat | absent standard | 10 min idle, ping recommandé | Helius-only actor policy | interne | deterministic timer tests |
|
||||
| replay historique | absent standard | pas de contrat WS KSP | interdit | absent | docs/canary no promise |
|
||||
| Capability | Standard KSP | Helius doc actuelle | Décision `0.2.8` | Surface Helius attendue | Preuve finale attendue |
|
||||
|------------------------------|----------------:|-------------------------------------------------|--------------------------|-------------------------|---------------------------------------|
|
||||
| `accountSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `logsSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `programSubscribe` pair | oui | supporté | réutiliser wire standard | présente | exact wire + no regression |
|
||||
| `rootSubscribe` pair | oui | supporté | réutiliser standard | présente | exact wire + no regression |
|
||||
| `signatureSubscribe` pair | oui | supporté | réutiliser standard | présente | one-shot conservé |
|
||||
| `slotSubscribe` pair | oui | supporté | réutiliser standard | présente | exact wire + no regression |
|
||||
| `blockSubscribe` pair | oui, unstable | non supporté | ne pas exposer Helius | **absente** | API absence + guard interne avant I/O |
|
||||
| `slotsUpdatesSubscribe` pair | oui, unstable | page spécifique + overview courant = disponible | réutiliser wire standard | présente | exact wire + warning unstable |
|
||||
| `voteSubscribe` pair | oui, unstable | non supporté | ne pas exposer Helius | **absente** | API absence + guard interne avant I/O |
|
||||
| `transactionSubscribe` | non standard | extension Helius | ajouter typed | présente | request/ack/notification fixtures |
|
||||
| `transactionUnsubscribe` | non standard | documenté dans référence transaction | ajouter via handle | présente | exact method + late-message race |
|
||||
| `tokenAccounts` | non standard | `none/balanceChanged/all` | ajouter typed | présente dans filter | enum + serialization |
|
||||
| `notifyOn` account | non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
|
||||
| `notifyOn` program | non standard | deprecated, no-op Agave 4.2 | ne pas exposer | absente | absence DTO public |
|
||||
| enhanced account extra | non standard | mentionné, wire exact non publié | report explicite | absente | réaudit final |
|
||||
| proactive heartbeat | absent standard | 10 min idle, ping recommandé | Helius-only actor policy | interne | deterministic timer tests |
|
||||
| replay historique | absent standard | pas de contrat WS KSP | interdit | absent | docs/canary no promise |
|
||||
|
||||
## 4. Matrice des façades protocolaires
|
||||
|
||||
@@ -986,3 +987,73 @@ Le passage de 5 à 4 doctests est attendu : le canari compile-fail `Helius -X->
|
||||
|
||||
Verdict courant : **`pre.009` PREPARED ; `pre.010` bloqué jusqu'au gate opérateur.**
|
||||
|
||||
## 24. Fermeture `pre.009` et gate `pre.010`
|
||||
|
||||
Résultat opérateur `0.2.8-pre.9` :
|
||||
|
||||
```text
|
||||
[x] cargo fmt --all
|
||||
[x] audit Rust workspace = clean / 0 candidate
|
||||
[x] cargo check --workspace = vert, sans warning
|
||||
[x] cargo clippy --workspace --all-targets = vert, sans warning
|
||||
[x] Transport unit = 335/335
|
||||
[x] Transport public API = 41/41
|
||||
[x] release completeness = 33/33
|
||||
[x] Transport doctests = 4/4
|
||||
[x] cargo test --workspace = vert
|
||||
```
|
||||
|
||||
Verdict : **`pre.009` DONE.**
|
||||
|
||||
### 24.1 Stratégie live Helius retenue
|
||||
|
||||
Les pages Helius courantes confirment :
|
||||
|
||||
```text
|
||||
endpoints WSS unifiés mainnet/devnet avec api-key
|
||||
slotSubscribe disponible sur endpoint Helius
|
||||
transactionSubscribe = extension Helius
|
||||
Ping chaque minute recommandé contre l’inactivité
|
||||
```
|
||||
|
||||
La sécurité du credential n’est pas le seul critère. L’ownership KSP impose aussi :
|
||||
|
||||
```text
|
||||
[x] Transport ne lit pas KSP_SECRET_HELIUS_API_KEY
|
||||
[x] Transport ne dépend pas de Config
|
||||
[x] Config reste propriétaire de l’environnement et du secret
|
||||
[x] le smoke Config -> Transport existant reste une exception transitoire
|
||||
[x] aucun nouveau smoke cross-crates Helius n’est ajouté à Config
|
||||
```
|
||||
|
||||
Le smoke live Helius est donc **différé vers la future surface d’intégration/orchestration**. Le scénario minimal recommandé utilisera le profil `helius_devnet` puis `slotSubscribe`; un scénario `transactionSubscribe` restera optionnel et provider-entitlement-dependent. Cette absence de test live committé n’affaiblit pas les gates déterministes de `0.2.8`, déjà couverts par fixtures locales, capability guards, reconnect, heartbeat, backpressure et compliance.
|
||||
|
||||
### 24.2 Critères `pre.010`
|
||||
|
||||
```text
|
||||
[ ] workspace.package.version = 0.2.8-pre.10
|
||||
[ ] README décrit Helius = 7 familles standard + transaction
|
||||
[ ] README rappelle block/vote absents et slotsUpdates unstable
|
||||
[ ] README/USAGE documentent heartbeat Helius 60 s
|
||||
[ ] USAGE documente Config helius_devnet -> HeliusLaserStreamWsSession
|
||||
[ ] KSP_SECRET_HELIUS_API_KEY reste Config-owned
|
||||
[ ] aucun nouveau smoke Helius live dans Transport avec lecture env/secret
|
||||
[ ] aucun nouveau smoke Helius cross-crates ajouté à Config
|
||||
[ ] aucun Transport -> Config
|
||||
[ ] aucune nouvelle dépendance
|
||||
[ ] cargo tree -p ksp-onchain-transport-lib inspecté
|
||||
[ ] cargo tree -p ksp-onchain-transport-lib --duplicates inspecté
|
||||
[ ] cargo tree --duplicates inspecté
|
||||
[ ] cargo fmt --all
|
||||
[ ] audit Rust = clean
|
||||
[ ] cargo check = sans warning
|
||||
[ ] cargo clippy = sans warning
|
||||
[ ] Transport unit = 335
|
||||
[ ] Transport public API = 41
|
||||
[ ] release completeness = 34
|
||||
[ ] Transport doctests = 4
|
||||
[ ] cargo test --workspace = vert
|
||||
```
|
||||
|
||||
Verdict courant : **`pre.010` PREPARED ; `pre.011` bloqué jusqu’au gate opérateur et au cargo tree final.**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user