Files
khadhroony-solana-project/deltas/0.2.8/pre.007-fix.003.md

106 lines
3.3 KiB
Markdown

<!-- file: deltas/0.2.8/pre.007-fix.003.md -->
<!-- version: 1 -->
# Delta `0.2.8-pre.007-fix.003` — driver I/O sous horloge Tokio pausée
## 1. Base et défaut restant
Base appliquée :
```text
0.2.8-pre.7.fix.2
```
Le replay opérateur du `fix.002` est propre pour fmt/audit/check/Clippy mais reste à **330/331 unit** sur le même canari :
```text
helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
```
Après 256 `yield_now()` bornés, le Ping n'est toujours pas visible par le canal de la fixture TCP locale.
## 2. Version technique
```text
workspace.package.version = 0.2.8-pre.7.fix.3
commit attendu = v0.2.8-pre.007-fix.003
Git tag = aucun tag prerelease
```
Le header root `Cargo.toml` passe en version `230`.
## 3. Diagnostic affiné
La revue du runtime confirme que `src/ws_session.rs` possède déjà le chemin attendu :
```text
heartbeat_deadline = now + 60 s
tokio::select! -> sleep_until(heartbeat_deadline)
send_helius_heartbeat() -> websocket.send(Ping)
succès -> heartbeat_deadline = now + 60 s
```
Le canari de reconnexion actor réel reste vert et observe un Ping après réarmement. Aucun défaut runtime nouveau n'est donc démontré.
Le défaut est dans le harness : avec l'horloge Tokio pausée, `yield_now()` fait progresser les tâches runnable mais ne garantit pas à lui seul un tour du driver I/O OS. Une frame écrite vers le socket loopback peut donc ne pas encore être remontée jusqu'au `websocket.next()` de la fixture.
## 4. Correction du canari
Le helper yield-only est remplacé par une observation bornée qui :
```text
1. reprend temporairement l'horloge Tokio ;
2. attend `ping_rx.recv()` avec un timeout réel de 1 s maximum ;
3. mesure le temps réel consommé ;
4. repause immédiatement l'horloge ;
5. exige qu'un Ping ait été reçu.
```
La fenêtre n'est ouverte **qu'après** que l'horloge virtuelle a atteint le deadline attendu. Une seconde réelle ne peut donc pas masquer l'absence d'un heartbeat dont la cadence nominale est 60 s.
Pour le second intervalle, le temps réel consommé lors de la première propagation est soustrait de la phase pré-deadline puis réinjecté lors du franchissement suivant. Cela garantit :
```text
avant contrôle négatif : moins de 59 s depuis le réarmement réel
après avance positive : au moins 60 s depuis le réarmement réel
```
## 5. Runtime inchangé
Ce fix ne modifie pas :
```text
crates/ksp-onchain-transport-lib/src/ws_session.rs
HELIUS_WS_HEARTBEAT_INTERVAL = 60 s
WebSocket Ping control frame
actor/reconnect/shutdown
WsSessionSettings
Config / schema / env
transactionSubscribe / transactionNotification lifecycle
```
Aucune dépendance, feature, API ou visibilité n'est ajoutée.
## 6. Fichiers modifiés
```text
Cargo.toml
crates/ksp-onchain-transport-lib/unit_tests/ws_session.rs
docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md
docs/validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md
deltas/0.2.8/pre.007-fix.003.md
```
## 7. Gate opérateur
```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
```
Critère de fermeture : zéro warning, audit clean, **331 unit / 40 public API / 29 completeness / 4 doctests** et workspace vert.