# 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.