v0.2.8-pre.007-fix.001
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<!-- file: docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md -->
|
||||
<!-- version: 17 -->
|
||||
<!-- version: 18 -->
|
||||
|
||||
# Plan `0.2.8` — Helius LaserStream WebSocket
|
||||
|
||||
> **Statut : `0.2.8-pre.006` est validé intégralement. `0.2.8-pre.007` prépare maintenant le heartbeat Helius LaserStream WebSocket provider-owned dans l'actor physique unique : Ping control frame à 60 s, timer uniquement en `Active`, réarmement après reconnect et arrêt immédiat au shutdown.**
|
||||
> **Statut : `0.2.8-pre.007` est fonctionnellement implémenté mais son gate opérateur révèle un défaut de canaris Tokio pausés et un lint `implicit_return`. `0.2.8-pre.007-fix.001` corrige uniquement le protocole de test ; le runtime heartbeat Helius 60 s reste inchangé.**
|
||||
|
||||
## 1. Objet, base et état courant
|
||||
|
||||
@@ -34,10 +34,11 @@ pre.005 contrat typed transactionSubscribe/unsubscribe validé
|
||||
pre.005-fix.001 correction types de canaris + visibilité/tests/règles validée
|
||||
pre.005-fix.002 suppression warnings dead_code via cfg(test) validée
|
||||
pre.006 transactionNotification + lifecycle actor validé
|
||||
pre.007 heartbeat Helius WebSocket / idle préparé
|
||||
pre.007 heartbeat Helius WebSocket / idle — checkpoint gate à corriger
|
||||
pre.007-fix.001 déterminisme canaris Tokio + lint test — préparé
|
||||
|
||||
workspace.package.version courant = 0.2.8-pre.7
|
||||
commit attendu = v0.2.8-pre.007
|
||||
workspace.package.version courant = 0.2.8-pre.7.fix.1
|
||||
commit attendu = v0.2.8-pre.007-fix.001
|
||||
aucun tag prerelease
|
||||
```
|
||||
|
||||
@@ -67,7 +68,9 @@ pre.005 DONE — transactionSubscribe request typed + filters/options/tokenAcco
|
||||
fix.002 DONE — helpers wire non consommés en production bornés à #[cfg(test)] ; zéro warning dead_code
|
||||
pre.006 DONE — transactionNotification + handle live + actor registry/reconnect/resubscribe/unsubscribe races
|
||||
+ late notifications + backpressure ciblée, sans second actor/socket
|
||||
pre.007 PREPARED — heartbeat Helius WebSocket/idle + timers + interaction reconnect/control frames/shutdown
|
||||
pre.007 CHECKPOINT — heartbeat Helius WebSocket/idle + timers + interaction reconnect/control frames/shutdown
|
||||
fix.001 PREPARED — actor armé avant avance de l'horloge Tokio + close accepte canal d'observation fermé
|
||||
+ `return;` explicite du helper de yield pour `clippy::implicit_return`
|
||||
pre.008 provider adversarial lifecycle + capability guards + payload/backpressure + security/redaction
|
||||
pre.009 compliance Helius WebSocket + non-régressions Solana standard 18/18 + HTTP 52/14
|
||||
+ Config/API/dependency-firewall canaries
|
||||
@@ -1138,3 +1141,43 @@ doctests compile-fail 4
|
||||
|
||||
Le heartbeat Helius reste un mécanisme de maintien de connexion ; il n'introduit aucune promesse de replay WebSocket ni de livraison lossless.
|
||||
|
||||
## 16. Checkpoint `pre.007` et préparation `pre.007-fix.001`
|
||||
|
||||
Checkpoint opérateur `0.2.8-pre.007` reçu le 2026-08-23 :
|
||||
|
||||
```text
|
||||
[x] cargo fmt --all
|
||||
[x] python3 scripts/audit_rust_workspace_rules.py = clean
|
||||
[x] cargo check --workspace = sans warning
|
||||
[!] cargo clippy --workspace --all-targets
|
||||
unit_tests/ws_session.rs: yield_runtime_steps() termine sans `return;` explicite
|
||||
[!] cargo test -p ksp-onchain-transport-lib
|
||||
329/331 unit passent ; 2 canaris heartbeat échouent
|
||||
[ ] cargo test --workspace — non retenu tant que le gate Transport n'est pas vert
|
||||
```
|
||||
|
||||
Les quatre autres preuves heartbeat importantes passent déjà : policy Helius-only/60 s, absence de heartbeat standard, erreur d'écriture mappée vers le reconnect existant, et réarmement après reconnexion. Le défaut observé est donc borné au harness de test, pas au chemin runtime `ws_session.rs`.
|
||||
|
||||
Cause exacte des deux canaris :
|
||||
|
||||
```text
|
||||
helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
|
||||
l'horloge pausée est avancée avant d'avoir garanti un premier poll de l'actor ;
|
||||
le sleep_until heartbeat peut donc être armé seulement après l'avance.
|
||||
|
||||
helius_explicit_close_cancels_heartbeat_before_deadline
|
||||
après close, le serveur fixture termine et le sender d'observation est détruit ;
|
||||
try_recv() peut légitimement rendre Disconnected au lieu de Empty.
|
||||
```
|
||||
|
||||
`fix.001` ne touche pas le runtime heartbeat. Il modifie uniquement le canari :
|
||||
|
||||
```text
|
||||
- `yield_runtime_steps()` termine par `return;` explicite ;
|
||||
- après `tokio::time::pause()`, l'actor reçoit plusieurs yields avant la première avance ;
|
||||
- le test close prouve d'abord `Empty` à t=30 s avant close ;
|
||||
- après close, il exige seulement qu'aucun `Ok(())` Ping n'ait été observé, donc `Empty` et `Disconnected` sont tous deux acceptables.
|
||||
```
|
||||
|
||||
La constante 60 s, la frame Ping, le branch actor, le reconnect, Config et `WsSessionSettings` restent byte-for-byte hors du fix. `pre.008` reste bloqué jusqu'au replay vert de `pre.007-fix.001`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user